gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:18:59 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com