好吧,我知道 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.....你的评论对我帮助很大
最佳答案
这些变量不需要按照声明的顺序分配。它们可以被编译器移动,甚至可以完全优化掉。如果您需要相对地址保持不变,请使用 struct
。
关于c - 自动局部变量是否存储在C中的堆栈中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11513305/