動的確保: malloc/free

必要な分だけ借りて、使い終わったら返す。大人のメモリ管理。

malloc
Memory Allocation。ヒープ領域からメモリを確保する関数。
free
mallocで確保したメモリを解放する関数。忘れるとリークする。
動的確保
プログラム実行中に必要なサイズを決めてメモリを確保すること。
レンタカー (Rental Car)

動的メモリ確保(malloc)は「レンタカー」です。 必要なときに申し込み(malloc)をして、一時的に車(メモリ)を借ります。 使い終わったら必ず返却(free)しなければなりません。もし返さないと、延滞料金が発生し続け、最悪の場合は破産(メモリ不足でクラッシュ)します。 また、返却した後にその車に乗ろうとする(Dangling Pointer)と、他の客が乗っているかもしれず、大事故になります。

実行時に場所を確保する

「ユーザーが何人になるかわからない」「どれくらいのサイズの画像を読み込むかわからない」。そんな時、 int users[100]; のように固定サイズで宣言するのは無理があります。

malloc (Memory Allocation) は、実行時に「これくらいのサイズください」とOSにお願いして、ヒープ領域からメモリを借りてくる関数です。使い終わったら free で返却します。これを忘れると「借りパク(メモリリーク)」になります。

基本的な使い方

malloc & free
#include <stdlib.h>
void func() {
// 1. メモリを借りる (int 10個分)
int *array = (int*)malloc(sizeof(int) * 10);
// 2. 借りられたかチェック (必須)
if (array == NULL) {
printf("Memory full!\n");
return;
}
// 3. 使う (普通の配列と同じ)
array[0] = 100;
// 4. 返す (これがないとリーク)
free(array);
}

実践テクニック

サイズ変更とゼロクリア

  • calloc(n, size): 確保した領域をすべて0で埋めてくれます。安全です。
  • realloc(ptr, new_size): 一度確保した領域のサイズを変更(引っ越し)します。便利ですが、失敗時の処理が少し複雑です。
realloc
// サイズ変更 (realloc)
// arrayの部屋を20個分に拡張して、中身も引っ越しする
int *new_array = (int*)realloc(array, sizeof(int) * 20);
if (new_array != NULL) {
array = new_array; // 成功したら新しい住所を使う
}

演習課題

課題1: 動的配列
ユーザーに整数Nを入力させ、サイズNの配列をmallocで確保し、0からN-1までの数字を入れて表示し、最後にfreeするプログラムを作ってください。

合格ライン

mallocの戻り値(NULL)チェックを行っている
mallocとfreeが1対1で対応している