malloc関数とfree関数
この記事では、C言語におけるmalloc関数とfree関数の内容と使用方法について記載する。
1. 目的
・malloc関数とfree関数の意味について知る。
・malloc関数とfree関数の使い方を知る。
目次
2. malloc関数とは
・動的メモリを確保する関数
・プログラムで予め、メモリを確保せず、必要な場所で必要なメモリを確保できる。
・成功時には、確保したメモリアドレスが、失敗時にはNULLがreturnされる。
・配列など、プログラム作成時点で、メモリサイズが決まらない場合に、使用する。
→ファイルを読み込み、そのファイルから文字列を配列に格納する時など。
ファイルにより、必要なサイズが異なり、プログラム作成時点で分からない場合がある。
2.1malloc関数の使い方
・必要ヘッダファイル:stdlib.h
・使用方法: 変数 = malloc(size_t);
引数:size_t型(サイズを表す型)
例:
int *addr; addr = (int *)malloc(4); //メモリを4バイト確保
3. free関数とは
・malloc関数やcalloc関数、realloc関数など、
動的に確保されたメモリを解放する為の関数。
・解放されたメモリは、再利用可能な状態となる。
・この解放を行わないと、確保したメモリが他のプログラムで使用できず、
メモリを確保し続けると他のプログラムで使用できるメモリが減っていく。
・確保したメモリが不要になった場合は、このfree関数で、メモリを開放する必要がある。
・特に長時間動作するプログラムなどで、メモリの解放を忘れ、メモリ確保を行い続けると、メモリが足らなくなり、バグが発生してしまうなどが起こる。
2.2 malloc関数を使用したプログラム
#include <stdio.h> #include <stdlib.h> int main(void){ // Your code here! char *addr; int i; addr = (char *)malloc(1); //1バイト確保 for(i=0;i<127;i++){ addr[i] = i+1; printf("%d\n",addr[i]); //addrに格納された数値を表示 } free(addr); //メモリ解放 }
・実行結果:https://paiza.io/projects/WJaosmK2yfWX4AF7od1Unw
メモリ確保失敗時の処理を追加した場合
#include <stdio.h> #include <stdlib.h> int main() { int *arr; int size = 5; // int型の要素を5つ分確保する arr = (int *)malloc(size * sizeof(int)); if (arr != NULL) { // メモリが正常に確保された場合、要素に値を代入して使用できる for (int i = 0; i < size; i++) { arr[i] = i + 1; printf("%d\n",arr[i]); } // メモリの使用が終わったら解放する free(arr); } else { printf("メモリの確保に失敗しました。\n"); } return 0; }
・実行結果:https://paiza.io/projects/8CSNDM-RGO6WuSLc-FECrg?language=c
参考:
・【C言語】malloc関数(メモリの動的確保)について分かりやすく解説 | だえうホームページ
・【C言語】free関数の使い方と注意点について解説 | だえうホームページ
関連記事
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary
・知らないと損するお金の話(ふるさと納税、確定申告とワンストップ納税どっちが得?) - Project_OKI’s diary
・STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary
・STM32マイコン_3(UART通信:複数文字送信) - Project_OKI’s diary