広告スペース

第28回 動的メモリ(malloc/free)

C言語の動的メモリ確保。malloc, free, メモリリークの原因と対策。

なぜ動的メモリが必要か

これまで配列は int a[5]; のようにサイズをコンパイル時に固定していました。でも実際のプログラムでは、「データが何件あるか実行してみないと分からない」場面が多くあります。
固定配列の問題
int a[100];
100件以上は入らない。少ない場合はメモリの無駄。
動的確保なら
int *a = malloc(n * sizeof(int));
n 件分だけ確保。必要に応じてサイズを変えられる。

malloc と free

malloc は指定バイト数のメモリを確保し、先頭アドレス(ポインタ)を返します。使い終わったら free で解放します。
#include<stdlib.h>  // malloc, free に必要

int *p = (int *)malloc(sizeof(int) * 5);
// int 5個分(= 20バイト)を確保

if(p == NULL){
  printf("メモリ確保失敗\n");
  return 1;
}

// 配列のように使える
for(int i = 0; i < 5; i++){
  p[i] = i * 10;
}

free(p);  // 使い終わったら必ず解放
sizeof(int) * 5 = 4 * 5 = 20バイト。malloc はバイト単位で確保するため、sizeof を使って型のサイズを掛けるのがセオリーです。

動的配列 ― 実行時にサイズを決める

ユーザーに個数を入力してもらってから配列を作る、という流れが動的メモリの典型的な使い方です。
int n;
printf("データ数: ");
scanf("%d", &n);

int *data = (int *)malloc(sizeof(int) * n);
if(data == NULL) return 1;

for(int i = 0; i < n; i++){
  printf("%d番目: ", i+1);
  scanf("%d", &data[i]);
}

// 合計計算
int sum = 0;
for(int i = 0; i < n; i++) sum += data[i];
printf("合計: %d\n", sum);

free(data); // 忘れずに解放
p[i]*(p + i) は同じ意味。malloc で得たポインタは配列と同じように [] でアクセスできます。

メモリリーク ― free を忘れると

malloc で確保したメモリを free し忘れると、プログラムが終了するまでそのメモリが解放されず占有されたままになります。これをメモリリークと呼びます。
🧪 メモリリーク シミュレーション
ボタンを押してメモリの変化を観察しましょう
⚠ 長時間動くプログラム(サーバー、組み込みシステム)では、メモリリークが致命的になります。小さなリークでも蓄積するとメモリ不足でプログラムがクラッシュする原因になります。malloc したら必ず free するを習慣にしましょう。

自分で書いてみよう ― 動的メモリ

動的配列を確保し、値を入れて合計を計算するプログラムです。
dynamic.c
出力
「実行」を押してください...
広告スペース

関連する講座

発展編
第25回 ポインタの基礎
C言語のポインタをメモリ可視化で理解。アドレスと間接参照を図解。
アルゴリズム編
第29回 データ構造入門
C言語で学ぶデータ構造。連結リスト・スタック・キューの実装と可視化。
リファレンス編
第32回 実行時エラーとSegfault
C言語のSegmentation Faultの原因と対処法。実行時エラーを完全解説。
← 前の講座
第27回 ファイル入出力
次の講座 →
第29回 データ構造入門

よくある質問(FAQ)

Q. mallocと配列、どっちを使うべき?

A. サイズが決まっているなら配列を使い、実行時に決まるならmallocを使います。例えば「最大100個」が決定済みなら配列、「ユーザーが個数を入力」するならmallocです。一般的に配列の方が高速で安全なので、できるだけ配列を優先しましょう。

Q. freeを忘れたらどうなる?

A. freeし忘れるとメモリリークが発生します。確保したメモリが使用不可になるため、長く実行するプログラムではメモリがどんどん減少し、最終的に「メモリ不足」でクラッシュします。mallocしたら「必ずfree」が原則です。確保と解放は対になっていないといけません。

Q. mallocとcallocの違いは?

A. mallocは指定サイズのメモリを確保しますが、中身は不定です。callocは確保したメモリを自動的に0で初期化します。callocの形式は `calloc(個数, サイズ)` で、例えば `calloc(10, sizeof(int))` は10個のint型を0で初期化して確保します。

Q. メモリリークって結局何?

A. メモリリークは「確保したメモリをfreeしないで、プログラム終了時に無駄になる」状態です。1回や2回なら問題ないですが、ループ内でmallocを繰り返すと累積し、メモリが枯渇します。デバッグには valgrind --leak-check=full などのツールを使って、リークを検出します。

確認クイズ

この講座の理解度をチェックしましょう!

Q1. malloc で確保したメモリを解放しないとどうなる?

自動的に解放される
メモリリークが発生する
コンパイルエラー

malloc で確保したメモリは free で明示的に解放しないとメモリリーク(メモリの無駄遣い)になります。

Q2. malloc(sizeof(int) * 10) は何をする?

int 型10個分のメモリを確保
int 型1個分のメモリを確保
10バイトのメモリを確保

sizeof(int) × 10 で int 型10個分のサイズを計算し、そのバイト数のメモリをヒープ上に確保します。

Q3. free した後のポインタはどうすべき?

そのまま使い続ける
NULL を代入する
何もしなくてよい

free 後のポインタは無効なアドレスを指す「ダングリングポインタ」になります。NULL を代入して安全にするのが良い習慣です。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。