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 .....你的评论给了我很多帮助