質問: 123; return p; } int main() { return *f(); } ``` このような実装で帰ってくる値が123になりますが、ローカル変数にmallocしてそれを返して参照するのは未定義動作ですか? (メモリリークは無視してます)
回答: A: ローカル変数が格納されるメモリ領域はスタックに確保されます。関数から戻ると、関数が使っていたスタック領域は解放されます。 B: malloc()で確保されるメモリ領域は、スタックとは別の領域です。これはfree()してあげないと解放されません。 上記AとBを、ごちゃまぜにしないようにしましょう。 ■saki_chanさんが書いたコードについて: 変数pは「123」を格納していません。malloc()で確保された動的メモリ領域の先頭アドレスを格納しています。 変数pはスタック上に確保されていますが、pが自身の領域に格納しているアドレス値が指すメモリ領域はmalloc()で確保されています。変数pに絡んでいるメモリ領域は2つありますが、それは大丈夫ですか?ここの理解が一番大事です。 f()が返すのは、pが保持しているアドレス値です。 そんで、 ``` int* p2 = f(); ``` とか書くと、f()が戻った時にpの領域は破棄されていますが、代わりにスタック上にp2が確保され、pが保持していたアドレス値はp2にコピーされています。この間、malloc()で確保した領域に対してはfree()してないので、確保されたままです。 なのでmalloc()で確保した領域に対してp2を通じてアクセスするのに何の問題もありません。だって解放してないですから。