关于指针和局部变量回收的问题
这个z是局部变量,为什么c()函数调用完之后,系统回收了z这个变量,但是指针p还可以使用z这个变量里面的数据啊,z不是已经被回收了吗,不是已经没有了吗?file:///E:\qq\Users\214611026\Image\)4D]7YI$H45CB1PXO(6IN2H.jpg代码如下:
#include <stdio.h>
void main()
{
int *p,c();
p=c();
printf("%d",*p);
}
int c()
{
int z=10000;
return &z;
}
本帖最后由 折心灬小轩 于 2014-1-18 21:47 编辑
如问题,函数内的变量z的作用域为代码块作用域,其存储类型为栈上的自动变量。
作用域决定了变量的有效访问区域,在此问题中,代码块作用域决定了变量z的访问范围为函数内的代码块。
存储类型决定了变量的“存储时间的长短”,自动变量指在栈上由编译器控制分配的变量,其保存的数据出了其作用域即“无效”。
回归本题,函数c返回了一个栈上的自动变量的地址,并把这个地址返回给了一个在main函数中的局部指针变量。当然,函数内变量在线程出了函数c时,推栈,变量z已经无效,但是它作为一个存在在内存中的一个有效区域依旧是存在的,此时它的值还是函数中定义的10000,这一点没有改变。而函数的返回值正把这个变量的地址赋值给了man中的指针变量,也就是说指针变量指向了这个“无效”的存储空间。
要注意,C中的输出是不检查变量是否有效,只要指出要输出的变量的地址,就可以输出,即C中的透明访问是未必安全的;而C中的真引用,即产生副作用的访问是能确保其操作的安全的,如果被操作的对象(某个存储空间或其线性排列)是不安全的,程序会崩溃。
总结,可以输出,但不可以改变,你可以在输出后再加上一句*p=100;之后再输出p指向的变量的值,你就会发现,程序输出10000后崩溃。
就是这样,希望能帮助到你。 但是我试过了加上*p=100,不会崩溃啊 那样改变的是p的值,不是z的值 哦,我明白了
没有鱼币下载不了
页:
[1]