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

C言語では、プログラムの実行中にメモリを確保することができます。
これを動的メモリ確保と呼び、その際に使用する代表的な関数が「malloc」と「free」です。
ポインタの理解が一通りできたタイミングで学ぶべき、非常に重要な内容です。
malloc / freeとは何か
mallocとfreeは、それぞれ次の役割を持っています。
- malloc:メモリを確保する
- free:確保したメモリを解放する
基本的な使用例は次の通りです。
int *p = malloc(sizeof(int));
free(p);
初心者さんmallocって、結局何をしてるんですか?



簡単に言うと、“使っていいメモリを借りてくる”関数だよ
基本的なポインタの使い方についてはこちらの記事で解説しています。


なぜ動的メモリ確保が必要なのか
通常の配列は、あらかじめサイズを決めておく必要があります。
int a[10];しかし実際のプログラムでは、
- 入力によってサイズが変わる
- 実行時まで必要なサイズが分からない
といったケースが多くあります。
int n;
scanf("%d", &n);
int *p = malloc(sizeof(int) * n);


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



そうなんだ。固定配列ではできない柔軟な使い方ができるよ
mallocの基本構文
mallocは次のように使用します。
malloc(確保したいバイト数)
int *p = malloc(sizeof(int));ポイントは以下の通りです。
- バイト単位で指定する
- 戻り値はポインタ
- 必ずポインタで受け取る
配列としての使い方
int *p = malloc(sizeof(int) * 5);
p[0] = 10;
p[1] = 20;mallocで確保したメモリは、通常の配列と同じように扱えます。



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



見た目は同じだけど、“後からサイズを決めている”のが大きな違いだよ
mallocは初期化されない(重要)
mallocで確保されたメモリは、初期化されません。
int *p = malloc(sizeof(int));
printf("%d", *p);この値は不定(ゴミ値)になります。
*p = 0;または
memset(p, 0, sizeof(int));のように初期化しましょう。



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



ここは初心者が一番ハマるポイントだね
freeとは(メモリの解放)
mallocで確保したメモリは、使用後に必ず解放します。
free(p);解放しないと、
- メモリリーク
- メモリ不足
- 長時間動作で不具合
といった問題が発生します。
mallocとfreeの基本パターン
int *p = malloc(sizeof(int) * 10);
if (p == NULL) {
return;
}
p[0] = 100;
free(p);この流れが基本形です。



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



メモリがどんどん消費されて、最終的に動かなくなるよ
よくあるミス① メモリリーク
void func() {
int *p = malloc(sizeof(int) * 100);
}freeが呼ばれていないため、メモリが解放されません。
よくあるミス② 解放後の使用
free(p);
*p = 10;これは未定義動作です。
free(p);
p = NULL;としておくと安全です。
callocとの違い
int *p = calloc(5, sizeof(int));callocはメモリを0で初期化します。
| 関数 | 初期化 |
|---|---|
| malloc | なし |
| calloc | 0初期化 |



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



用途次第だけど、初期化不要ならmallocの方が軽いよ
組み込み開発でmallocが敬遠される理由
組み込み開発では、mallocの使用を避けるケースが多いです。
- メモリ断片化
- 実行時間が一定でない
- リアルタイム性への影響
そのため、
- 静的配列
- 固定メモリ
がよく使われます。
組み込み開発でmallocが敬遠される理由については、こちらの記事で詳しく解説しています。


まとめ
- mallocは実行時にメモリを確保する関数
- freeで必ず解放する必要がある
- 初期化されないため注意
- NULLチェックは必須
- 組み込みでは慎重に使う
この記事が参考になった方へ
C言語ポインタ解説シリーズ一覧はこちらです。


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


技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。









コメント