中級 › 関数内のローカル変数のアドレスを返すと解放済み領域を指す › パターン1
関数内のローカル変数のアドレスを返すと解放済み領域を指す
関数の中で宣言したローカル変数は、その関数を抜けると同時に領域が無効になります。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int *makeValue(int v) { 5 int local = v; 6 int *heap = malloc(sizeof(int)); 7 *heap = v; 8 return ______; ^ 9 } 10 11 int main(void) { 12 int *p = makeValue(42); 13 printf("%d\n", *p); 14 return 0; 15 }
Segmentation fault
空欄を埋めてコンパイル・実行を通す
localは関数を抜けると同時に無効になるスタック上の変数です。そのアドレスを返すと、main側で別の関数(printf)を呼んだ瞬間に同じ領域が上書きされ、クラッシュします。malloc()でヒープに確保したheapは関数を抜けても無効になりません。
次の問題