【发布时间】:2012-07-16 22:09:15
【问题描述】:
好的,我知道 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 .....您的评论对我帮助很大
【问题讨论】:
-
调用堆栈可以向上或向下,具体取决于架构。
-
请注意,C语言并没有说明你的本地变量在源代码中的顺序是否与编译程序中的顺序相同。 (它们甚至被一起优化掉了)。
-
@user315052 .... 我正在使用 x86
-
@Opetmar:这不是了解堆栈增长情况的好方法。尝试检查
main调用的函数中变量的地址以及该函数调用的变量,即。不同堆栈帧中的变量。您正在比较同一堆栈帧中变量的地址,因此它取决于编译器要在该帧中对它们进行排序的位置。查看 main 的反汇编,您可能会在堆栈指针上看到一个减法操作,它将所有这些变量分配在一个块中。 -
另外请注意,这种调查通常很少告诉您 c 的工作原理,因为您可以通过这种方式查看的几乎所有细节都留给了实现。所以你所学到的只是那个特定的编译器是如何工作的。
标签: c memory gcc local-variables