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

Oma*_*mar 1 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);
        }
Run Code Online (Sandbox Code Playgroud)

结果是:

0xbfca41e0
0xbfca41e4
0xbfca41e8
0xbfca41ec
Run Code Online (Sandbox Code Playgroud)

根据堆栈顶部的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  
..
Run Code Online (Sandbox Code Playgroud)

..

编辑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;
}
Run Code Online (Sandbox Code Playgroud)

结果:

inside the main
0xbfe82d60
0xbfe82d64
0xbfe82d68
0xbfe82d6c
inside the function
0xbfe82d28
0xbfe82d2c
Run Code Online (Sandbox Code Playgroud)

所以fun()堆栈框架内的变量位于main()堆栈框架内的变量之下,根据堆栈的性质,这是真的,但在同一堆栈框架内,不需要从顶部到底部进行排序.

谢谢@AusCBloke .....你的评论给了我很多帮助

Gre*_*sev 8

不要求按照声明的顺序分配这些变量.它们可以被编译器移动,甚至完全优化.如果您需要相对地址保持不变,请使用struct.