这是代码:
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
两次的结果不一样,这是为什么呢?
在Get_A中
返回
的a指针根本不应该这么返回。在Get_A
中的a在栈上分配,退出函数后,栈就弹出了,之所以你第一次调用能够看到结果,是因为栈虽然弹出了,但是其中的数据并没有清空,而且恰好,在进入printf函数前,a和a+1这两个形参被复制了一份给printf用。然而第一次printf时,栈就被“破坏了”,但是你的外部的a还是指向原来的栈的某个地址,所有后续发生什么就无法预测了。