動的確保: malloc/free
必要な分だけ借りて、使い終わったら返す。大人のメモリ管理。
malloc
Memory Allocation。ヒープ領域からメモリを確保する関数。
free
mallocで確保したメモリを解放する関数。忘れるとリークする。
動的確保
プログラム実行中に必要なサイズを決めてメモリを確保すること。
実行時に場所を確保する
「ユーザーが何人になるかわからない」「どれくらいのサイズの画像を読み込むかわからない」。そんな時、
int users[100]; のように固定サイズで宣言するのは無理があります。
malloc (Memory Allocation)
は、実行時に「これくらいのサイズください」とOSにお願いして、ヒープ領域からメモリを借りてくる関数です。使い終わったら 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)// 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で対応している