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