メモリの確保および操作関数

C

動的なメモリ確保

変数や配列を宣言すると自動的にメモリ上に領域が確保される。
プログラムが多くのデータを扱う場合、メモリを一度に用意しきれない場合があるので、無理に大きすぎるメモリ領域を一気に確保しようとするとエラーになってしまう。

この場合は動的にメモリ領域を確保する方法を使う。

動的にメモリ領域を確保するには、下記のC言語の標準ライブラリの呼び出しをする

#include <memory.h>
#include <malloc.h>
#include <stdlib.h>
//確保したメモリの先頭アドレスを入れるポインタを宣言
short *buf;

//「(short *)」の部分でmallocの戻り値に対して、型のキャストをする
buf = (short *)malloc(sizeof(short) * 2000);

(メモ)
「malloc」関数は、ヒープメモリからsizeバイトのブロックを割り当てる。
この関数を使うことにより、必要な場所で必要なだけメモリを確保することができる。

 

  • ■メモリの利用

malloc関数で確保したメモリは使用後に必ずfree関数で解放する。

//確保した後、通常の配列と同じように使える
buf[2] = 40;
  • ■メモリの解放

使い終わったら、メモリを必ず解放する

free(buf);
  • ■メモリ確保関係の関数

malloc関数の代わりにcalloc関数を使う書き方もできる。

buf = (char *)calloc(sizeof(char) * 20);

(メモ)
「calloc」関数は、メモリを確保し、要素をすべて0に初期化する

realloc関数を使う書き方もできる。

buf = (char *)realloc(buf, sizeof(char)*15);

(メモ)
「realloc」関数は、一度確保したメモリを違うサイズで確保し直す

  • ■メモリ操作関数

メモリを操作する関数はmemset、memcpyなどがある(←ごく一部の例)

//メモリの内容を全て同じ値に設定する
memset(buf, 0, 5);
//↑の例だと、配列の要素5個に対して、全て「0」を代入する動きをする

memcpy(dst, src, 5);
//↑の例、srcというコピー元のメモリ領域の先頭アドレスから5バイト分、dstのアドレスへ代入する
  • 例(書籍そのままを動かしてみる)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>

int main(void)
{
    char *b;
    char a[4] = {20, 40, 30, 100};
    b = (char *)malloc(sizeof(char) * 200);
    
    if (!b) {
        return;
    }
    
    memcpy(b, a, sizeof(char) * 4);
    printf("%d %d %d %d \n", b[0], b[1], b[2], b[3]);
    free(b);

    //結果「20 40 30 100」と表示される
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です