#include<stdio.h> int *test(int a); int main() { int *p; int a; p=test(3); a=*p; a=*p; a=*p; a=*p; printf("%d\n",*p); printf("%d\n",*p); return 0; } int *test(int a) { int *p=&a; return p; }
在如上代码中 对a赋值多次 p的地址都是有效的
但是为什么在调用一次printf后 对p的间接引用却是无效的
解决方案
20
本来就是一个未定义的行为,发生什么结果都不奇怪。
毕竟你让p指向了一个形参的地址(局部变量)
毕竟你让p指向了一个形参的地址(局部变量)
5
test函数返回后局部变量销毁,但是仍然有指针指向这块内存,这块内存随时有可能被修改成不同的内容,所以得到了不确定的结果
5
在调用了int *test(int a)函数之后,内存被释放,但是此处,虽然*p指向已经被释放区域,但是此处内存可能没有被覆盖,等到第二次打印的时候也许此处内存被覆盖了,所以打印会出现任意情况
5
房东租给你了一间房子,配了一把钥匙给你,结果到期了,你还占着房子以为是你的,结果房东找到了新租客,你的东西全被房东扔了,然后你还理直气壮的拿着钥匙问为什么。
10
有效最多能说明运气好,调用prinft后无效原因是printf函数参数以及内部变量需要在栈上开辟空间,将你之前的值覆盖了
10
栈中的变量通常包括函数参数和函数里声明的临时变量。
栈中的基本变量退出其作用域时,没有谁执行一段代码去释放/销毁/析构它所占用的内存,仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。
而栈中的类变量退出其作用域时,会自动执行其析构函数,……
栈中的基本变量退出其作用域时,没有谁执行一段代码去释放/销毁/析构它所占用的内存,仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。
而栈中的类变量退出其作用域时,会自动执行其析构函数,……