Namaran

Code daily. Without assist.

2026-09-07

read_after_free.c

#include <stdio.h>
#include <stdlib.h>

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

このコードはたいてい42を出力しますが、それに頼るべきではない危険なコードです。何が問題で、どう直せばよいでしょうか?

Answer

free(p)を呼んだ時点でpが指していたメモリ領域は解放され、p自身はダングリングポインタになります。その後の*pはすでに手放した領域を読むことになり、未定義動作です — たまたま中身が書き換えられずに残っていれば42が出ますが、他の確保がその領域を再利用していればゴミが出ますし、クラッシュすることもあります。最小限の修正は、値を使い終えてからfreeすることです:

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