函数返回数组指针,执行printf两次得到的结果不一样。
这是代码:
int* Get_A() {
int a[2] = { 1, 2 };
return a;
}
int main() {
int *a = Get_A();
printf("%d %d\n", *a, *(a + 1));
printf("%d %d\n", *a, *(a + 1));
printf("%d %d\n", *a, *(a + 1));
}
在visual studio运行得到的结果:
1 2
-2 15727148
-2 15727148
两次的结果不一样,这是为什么呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在Get_A中
返回
的a指针根本不应该这么返回。在Get_A
中的a在栈上分配,退出函数后,栈就弹出了,之所以你第一次调用能够看到结果,是因为栈虽然弹出了,但是其中的数据并没有清空,而且恰好,在进入printf函数前,a和a+1这两个形参被复制了一份给printf用。然而第一次printf时,栈就被“破坏了”,但是你的外部的a还是指向原来的栈的某个地址,所有后续发生什么就无法预测了。或许用变量的作用域更便于题主理解。
在Get_A函数中,数组a的作用域仅仅是此函数内,返回值所指向的地址也是一个“临时变量”的地址。
因此,尽管main函数里的指针变量a获得了这个返回的地址,但这个地址实际上已经没有了意义,成为了“野地址”,正如 P_Chou水冗 所说的,第一次printf输出的还是这个地址存储的“临时变量”的值,但这也仅仅是因为这个 野地址 恰好还没有被系统调用,一旦被系统使用,地址内的数据会被覆盖,当再次printf时就是这一时刻的新数据值了。