int* test()
{
int a = 10;
return &a;
}
int main()
{
int* p = test();
printf("%d\n", *p);
return 0;
}
关于此代码:(其实是一个野指针问题)
(1)test函数中临时创建了变量a,然后返回的是a的地址,在返回结束test函数的栈帧会销毁
(2)主函数中用指针变量p来接收a的地址,但是由于a在test函数调用完成后就会被销毁,从而导致我们可以通过p来找到a的地址,但是找不到a的内容,因为此时该内容已经不属于此时此刻所运行的程序,被还到了原来的内存之中,所以此时此刻p就成为了野指针。
(3)但此代码运行结果却是10(在vs中),如图所示:
但但当用接下来的代码运行结果就会发生变化:
代码:
int* test()
{
int a = 10;
return &a;
}
int main()
{
int* p = test();
printf("hehehe\n");
printf("%d\n", *p);
return 0;
}
结果:
原因:第一个printf函数再调用是,覆盖了之前调用test函数所用的空间,此时原来a处的值就有可能被改变(如果对函数栈帧创建与销毁有了解的话应该很容易懂)
在测试:(每一次覆盖都不同)