さて、私は main() 自動ローカル変数がスタックに保存され、関数の自動ローカル変数も保存されていることを知っていますが、gcc バージョン 4.6.3 で次のコードを試したとき:
#include <stdio.h>
int main(int argc, char *argv[]) {
int var1;
int var2;
int var3;
int var4;
printf("%p\n%p\n%p\n%p\n",&var1,&var2,&var3,&var4);
}
結果は次のとおりです。
0xbfca41e0
0xbfca41e4
0xbfca41e8
0xbfca41ec
結果によると、スタックの上部に var4 があり、スタックの下部に var1 があり、スタック ポインターは現在 var1 アドレスの下のアドレスを指しています....しかし、スタックの上部に var4 があり、下部に var1 があるのはなぜですか。 .. var1 の後に宣言されているので、論理的には、var1 はスタックの一番上にある必要があり、var1 の後に宣言された変数はメモリ内でその下にある必要があると思います...したがって、私の例では次のようになります。
>>var1 at 0xbfca41ec
>>var2 at 0xbfca41e8
>>var3 at 0xbfca41e4
>>var4 at 0xbfca41e0
>>and stack pointer pointing here
..
..
編集1:
@AusCBloke のコメントを読んだ後、次のコードを試しました。
#include <stdio.h>
void fun(){
int var1;
int var2;
printf("inside the function\n");
printf("%p\n%p\n",&var1,&var2);
}
int main(int argc, char *argv[]) {
int var1;
int var2;
int var3;
int var4;
printf("inside the main\n");
printf("%p\n%p\n%p\n%p\n",&var1,&var2,&var3,&var4);
fun();
return 0;
}
そして結果:
inside the main
0xbfe82d60
0xbfe82d64
0xbfe82d68
0xbfe82d6c
inside the function
0xbfe82d28
0xbfe82d2c
したがって、fun() スタック フレーム内の変数は main() スタック フレーム内の変数の下にあり、これはスタックの性質によると当てはまりますが、同じスタック フレーム内では上から下に並べる必要はありません。
ありがとう@AusCBloke .....あなたのコメントは私を大いに助けてくれました