Cでのスタックの振る舞いについて何か誤解しているのではないかと心配しています。
次のコードがあるとします。
int main (int argc, const char * argv[])
{
int a = 20, b = 25;
{
int temp1;
printf("&temp1 is %ld\n" , &temp1);
}
{
int temp2;
printf("&temp2 is %ld\n" , &temp2);
}
return 0;
}
両方のプリントアウトで同じアドレスを取得できないのはなぜですか?temp1がリサイクルされなかったかのように、temp2がtemp1から1int離れていることがわかりました。
私の期待は、スタックに20と25が含まれることです。次に、temp1を上に置き、次にそれを削除し、次にtemp2を上に置き、次にそれを削除します。
MacOSXでgccを使用しています。
最適化せずにコンパイルするために-O0フラグを使用していることに注意してください。
この質問の背景について疑問に思っている人:私はCの教材を準備しており、関数から自動変数へのポインターを返すことを避けるだけでなく、からの変数のアドレスを取得することも避けるべきであることを生徒に示しようとしています。ネストされたブロックとそれらを外部で逆参照します。これがどのように問題を引き起こすかを実証しようとしていたのですが、スクリーンショットを取得できませんでした。