这个问题是关于c和c++中对于参数,变量在内存中地址分配的问题。对于以下代码
int main (int argc, char *argv[]) {
int a;
int b;
a = 1;
b = 2;
return 0;
}
我的理解是,main函数是通过初始函数调用,main函数实际和其他函数一样。
在初始函数调用main函数后,会先将返回地址压入堆栈,接着将参数压入堆栈。面对函数中定义的局部变量,将会按照定义顺序分配堆栈内存空间。而堆栈是从高地址向低地址生长的,所以我认为&a > &b。
然而,在gdb调试过程中,我发现&b > &a。请问我的理解在哪里错了?
局部变量的空间不是一个一个压入栈中的,而是一次性分配好的,所以理解为变量依次入栈是错误的。C语言也没有规定局部变量在内存中的位置,只是常常实现为先定义的变量在高地址、后定义的变量在低地址。不过局部变量在栈上的位置没有绝对的关系,甚至不一定会出现在栈上。比如你的代码做这样的调整,改成下面这样:
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
printf( "a = %d, b = %d\n", a, b );
printf( "&a = %08x, &b = %08x\n", &a, &b );
return 0;
}
这个时候你会发现a变量确实分配在高地址,而b变量分配在低地址。如果你把你的程序加上-O2参数优化一下,那么a和b这两个变量因为没有被真正的使用,而被编译器优化掉,你直接p &a会得不到任何的值。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。