鱼C论坛

 找回密码
 立即注册
查看: 2598|回复: 1

关于指针和局部变量回收的问题

[复制链接]
发表于 2014-1-18 20:42:38 | 显示全部楼层 |阅读模式
1鱼币
这个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;
}


最佳答案

查看完整内容

如问题,函数内的变量z的作用域为代码块作用域,其存储类型为栈上的自动变量。 作用域决定了变量的有效访问区域,在此问题中,代码块作用域决定了变量z的访问范围为函数内的代码块。 存储类型决定了变量的“存储时间的长短”,自动变量指在栈上由编译器控制分配的变量,其保存的数据出了其作用域即“无效”。 回归本题,函数c返回了一个栈上的自动变量的地址,并把这个地址返回给了一个在main函数中的局部指针变量。当然,函数 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-18 20:42:39 | 显示全部楼层
本帖最后由 折心灬小轩 于 2014-1-18 21:47 编辑

如问题,函数内的变量z的作用域为代码块作用域,其存储类型为栈上的自动变量。
作用域决定了变量的有效访问区域,在此问题中,代码块作用域决定了变量z的访问范围为函数内的代码块。
存储类型决定了变量的“存储时间的长短”,自动变量指在栈上由编译器控制分配的变量,其保存的数据出了其作用域即“无效”。

回归本题,函数c返回了一个栈上的自动变量的地址,并把这个地址返回给了一个在main函数中的局部指针变量。当然,函数内变量在线程出了函数c时,推栈,变量z已经无效,但是它作为一个存在在内存中的一个有效区域依旧是存在的,此时它的值还是函数中定义的10000,这一点没有改变。而函数的返回值正把这个变量的地址赋值给了man中的指针变量,也就是说指针变量指向了这个“无效”的存储空间。
要注意,C中的输出是不检查变量是否有效,只要指出要输出的变量的地址,就可以输出,即C中的透明访问是未必安全的;而C中的真引用,即产生副作用的访问是能确保其操作的安全的,如果被操作的对象(某个存储空间或其线性排列)是不安全的,程序会崩溃。

总结,可以输出,但不可以改变,你可以在输出后再加上一句*p=100;之后再输出p指向的变量的值,你就会发现,程序输出10000后崩溃。

就是这样,希望能帮助到你。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-1-19 09:26:53 | 显示全部楼层
但是我试过了加上*p=100,不会崩溃啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-19 21:23:42 | 显示全部楼层
那样改变的是p的值,不是z的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-1-19 23:27:49 | 显示全部楼层
哦,我明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-25 22:42:17 | 显示全部楼层

没有鱼币下载不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 11:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表