好的,我知道 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 .....你的评论对我帮助很大