我知道从函数返回局部变量的地址是错误的做法。但当我尝试展示这个事实时,遇到了一个问题。请看以下程序:
int *test()
{
int x = 12;
int *p = &x;
return p;
}
int main()
{
int *p = test();
printf("%p",p);
return 0;
}
它如预期一样打印出类似于0061fed0
的地址。但是,如果我直接使用&
返回x的地址,即如果将test
函数更改为以下内容:
int *test()
{
int x = 12;
return &x;
}
那么输出结果就变成了00000000
。请您解释一下这里到底发生了什么?我正在使用在Windows 10上捆绑的Code:Blocks 17.12 IDE附带的gcc编译器。
关于重复问题: 建议的重复问题: C - GCC生成错误的指令来返回本地堆栈地址 解释了直接使用地址运算符的行为,但未解决使用指针变量返回局部变量地址的情况,在StoryTeller's的回答中进行了解释:“当指向的对象(或刚超过)达到其生命周期的末尾时,指针的值变得不确定”。