動的なメモリ確保
変数や配列を宣言すると自動的にメモリ上に領域が確保される。
プログラムが多くのデータを扱う場合、メモリを一度に用意しきれない場合があるので、無理に大きすぎるメモリ領域を一気に確保しようとするとエラーになってしまう。
この場合は動的にメモリ領域を確保する方法を使う。
動的にメモリ領域を確保するには、下記の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」と表示される }