広告スペース

確認問題(動的メモリ)

malloc/free、ダングリングポインタ、メモリリーク、callocの理解度を確認しましょう。

確認問題1 ― mallocの基本

int *p = (int *)malloc(sizeof(int) * 3);
p[0] = 10; p[1] = 20; p[2] = 30;
printf("%d\n", p[1]);
free(p);

出力結果は?

10
20
30
コンパイルエラー
解説: malloc(sizeof(int)*3) で int 3個分のヒープ領域を確保。p[1] は2番目の要素 = 20

確認問題2 ― free後のアクセス

int *p = (int *)malloc(sizeof(int));
*p = 42;
free(p);
printf("%d\n", *p);

このコードはどうなる?

42
0
未定義動作(ダングリングポインタ)
コンパイルエラー
解説: free後のポインタ(ダングリングポインタ)へのアクセスは未定義動作
値が残っているように見えることもありますが保証されません。free後は p = NULL; にするのが安全です。

確認問題3 ― メモリリーク

void func(void) {
    int *p = (int *)malloc(sizeof(int) * 100);
    *p = 42;
    // free(p) を忘れた
}

このコードの問題は?

コンパイルエラー
実行時エラー
メモリリーク(動くが領域が解放されない)
何も問題はない
解説: free を呼ばずに関数を抜けると、ポインタが失われ確保した領域を返却できなくなります。
これがメモリリーク。プログラムは動きますが、繰り返すとメモリを圧迫します。

確認問題4 ― callocとmalloc

int *a = (int *)calloc(5, sizeof(int));
printf("%d %d %d\n", a[0], a[2], a[4]);
free(a);

出力結果は?

不定値(ゴミ)
0 0 0
コンパイルエラー
Segmentation Fault
解説: calloc は malloc と違い、確保した領域を0で初期化します。
よってすべて 0 0 0。初期値が0でよい場合は calloc が便利です。

結果

回答してください
動的メモリの講座に戻るホームへ

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

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

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で演習問題も充実。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。
Amazonで見る

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

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