c - 自动局部变量是否存储在C中的堆栈中?

标签 c memory gcc local-variables

好吧,我知道 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/

相关文章:

gcc - Cuda Clang 和 OS X Mavericks

linux - GCC:指定最低共享库版本

c - 为什么这两个函数不将十进制转换为二进制(uint8_t)?

c - 在没有 CRT 编译的程序中,是否可以通过 argv 读取命令行参数?

c - 从结构返回值

c - rand() 在 C 中做什么?

C内存免混淆

大型数据集的 Python 双倍免费错误

delphi - TBitmap 到 TPngImage 和内存使用情况

c++ - std::string::find_first_of 未返回预期值