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