C言語:メモリー管理
仕事でC言語を使うので、その備忘録として記事をあげていきます。
なぜメモリーを確保する必要があるのか。
→プログラム内で使用するデータ数は未知なことが多い。
事前に必要なデータ数が不明な場合、実行時にライブラリ経由で
OSから必要となった分のメモリーを取得する。
不要となったメモリーはライブラリ経由でOSへ返却する。
◾️Cのライブラリ関数
① malloc関数
void *malloc(size_t size);
→sizeで指定したバイト数のメモリーを取得する
返り値は取得したメモリーへのポインタ
メモリーの確保ができなかった場合はNULLが返ってくる
② free関数
void free(void *ptr);
→mallocで確保したメモリー領域を解放する
ptrにはmallocが返したポインター or NULLでなくてはならない
③ memset関数
void *memset(void *s, int c, size_t n);
→nバイト分のサイズのデータをsがポイントする領域に対して、cでデータを書き込む。
*malloc + memset
malloc関数で確保した領域は不定値(値が決まっていない)ので、
memsetを使用してデータを初期化すると良い
*mallocがNULLを返してきた場合
この場合、通常はメモリ不足が原因なため、プログラムを終了させる必要がある。
そんな時はexit関数を使用する。
_Noreturn void exit(int status);
→exit関数はstatusで指定した値をコマンとの返り値とする。
main以外の関数内で実行を終了する際に使用する。
④ realloc関数
void *realloc(void *ptr, size_t size);
→mallocで取得したポインタの内容をコピーし、size分の領域を新たに確保し直す。