malloc / freeとは?C言語の動的メモリ確保を初心者向けに解説

目次

C言語ポインタ解説シリーズ

本記事は「C言語ポインタ解説シリーズ」の1つです。
C言語のポインタを、組み込み開発の視点も交えて解説します。

C言語ポインタ解説シリーズ一覧はこちら

C言語では、プログラムの実行中にメモリを確保することができます。
これを動的メモリ確保と呼び、その際に使用する代表的な関数が「malloc」と「free」です。

ポインタの理解が一通りできたタイミングで学ぶべき、非常に重要な内容です。


malloc / freeとは何か

mallocとfreeは、それぞれ次の役割を持っています。

  • malloc:メモリを確保する
  • free:確保したメモリを解放する

基本的な使用例は次の通りです。

C
int *p = malloc(sizeof(int));
free(p);

初心者さん

mallocって、結局何をしてるんですか?

エンジニアくん

簡単に言うと、“使っていいメモリを借りてくる”関数だよ

基本的なポインタの使い方についてはこちらの記事で解説しています。


なぜ動的メモリ確保が必要なのか

通常の配列は、あらかじめサイズを決めておく必要があります。

C
int a[10];

しかし実際のプログラムでは、

  • 入力によってサイズが変わる
  • 実行時まで必要なサイズが分からない

といったケースが多くあります。

C
int n;
scanf("%d", &n);

int *p = malloc(sizeof(int) * n);

初心者さん

なるほど、後からサイズ決めたいときに使うんですね

エンジニアくん

そうなんだ。固定配列ではできない柔軟な使い方ができるよ


mallocの基本構文

mallocは次のように使用します。

malloc(確保したいバイト数)

C
int *p = malloc(sizeof(int));

ポイントは以下の通りです。

  • バイト単位で指定する
  • 戻り値はポインタ
  • 必ずポインタで受け取る

配列としての使い方

C
int *p = malloc(sizeof(int) * 5);

p[0] = 10;
p[1] = 20;

mallocで確保したメモリは、通常の配列と同じように扱えます。


初心者さん

え、これ配列と同じじゃないですか?

エンジニアくん

見た目は同じだけど、“後からサイズを決めている”のが大きな違いだよ


mallocは初期化されない(重要)

mallocで確保されたメモリは、初期化されません

C
int *p = malloc(sizeof(int));
printf("%d", *p);

この値は不定(ゴミ値)になります。

C
*p = 0;

または

C
memset(p, 0, sizeof(int));

のように初期化しましょう。


初心者さん

勝手に0にならないんですね…

エンジニアくん

ここは初心者が一番ハマるポイントだね


freeとは(メモリの解放)

mallocで確保したメモリは、使用後に必ず解放します。

C
free(p);

解放しないと、

  • メモリリーク
  • メモリ不足
  • 長時間動作で不具合

といった問題が発生します。


mallocとfreeの基本パターン

C
int *p = malloc(sizeof(int) * 10);

if (p == NULL) {
  return;
}

p[0] = 100;

free(p);

この流れが基本形です。


初心者さん

freeって忘れるとどうなるんですか?

エンジニアくん

メモリがどんどん消費されて、最終的に動かなくなるよ


よくあるミス① メモリリーク

C
void func() {
  int *p = malloc(sizeof(int) * 100);
}

freeが呼ばれていないため、メモリが解放されません。


よくあるミス② 解放後の使用

C
free(p);
*p = 10;

これは未定義動作です。

C
free(p);
p = NULL;

としておくと安全です。


callocとの違い

C
int *p = calloc(5, sizeof(int));

callocはメモリを0で初期化します。

関数初期化
mallocなし
calloc0初期化

初心者さん

じゃあ最初からcallocでいいのでは?

エンジニアくん

用途次第だけど、初期化不要ならmallocの方が軽いよ


組み込み開発でmallocが敬遠される理由

組み込み開発では、mallocの使用を避けるケースが多いです。

  • メモリ断片化
  • 実行時間が一定でない
  • リアルタイム性への影響

そのため、

  • 静的配列
  • 固定メモリ

がよく使われます。

組み込み開発でmallocが敬遠される理由については、こちらの記事で詳しく解説しています。


まとめ

  • mallocは実行時にメモリを確保する関数
  • freeで必ず解放する必要がある
  • 初期化されないため注意
  • NULLチェックは必須
  • 組み込みでは慎重に使う

この記事が参考になった方へ

C言語ポインタ解説シリーズ一覧はこちらです。

またポインタを含むC言語の基本文法も一覧で整理しています。

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする


目次