网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月17日
漏签
0
天
c语言吧
关注:
798,694
贴子:
4,347,047
看贴
图片
吧主推荐
视频
游戏
1
2
下一页
尾页
50
回复贴,共
2
页
,跳到
页
确定
<<返回c语言吧
>0< 加载中...
【大神您辛苦了,小白求助】:关于指针和free函数的问题
只看楼主
收藏
回复
金翅大鹏雕岳飞
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
小弟顿首:
如图,指针指向了申请的4个字节,对该内存赋值为5,之后释放该空间,但是怎么还是可以对指向的空间进行读写操作呢?我的理解是指针指向的内存已经不存在了,但是,居然就神奇的输出了6,小白想不通啊........5555555
金翅大鹏雕岳飞
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
顶
金翅大鹏雕岳飞
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
顶
绝地孤魂
酱油
4
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
指针指向的内存没了,但是指针还在,它还是可以有负值这些操作,只不过不能指向你原来那块内存了,
绝地孤魂
酱油
4
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
人住的房子没了,但是人还在,还是可以继续找房子住,这样理解了吧?
绝地孤魂
酱油
4
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
你给指针赋值,是让指针指向你现在这个值的内存空间,并不是指针自己的内存,
展臂_飞翔
团子家族
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
free(str)后指针仍然指向原来的堆地址,即你仍然可以继续使用,但很危险,因为操作系统已经认为这块内存可以使用,他会毫不考虑的将他分配给其他程序,于是你下次使用的时候可能就已经被别的程序改掉了,这种情况就叫“野指针”,所以最好free()了以后再置空
str = NULL;
即本程序已经放弃再使用他。
下面是摘自论坛里面的形象比喻,加深理解。
CRT的内存管理模块是一个管家。
你的程序(简称“你”)是一个客人。
管家有很对水桶,可以用来装水的。
malloc的意思就是“管家,我要XX个水桶”。
管家首先看一下有没有足够的水桶给你,如果没有,那么告诉你不行。如果够,那么登记这些水桶已经被使用了,然后告诉你“拿去用吧”。
free的意思就是说:“管家我用完了,还你!”。
至于你是不是先把水倒干净才给管家,那么是自己的事情了。--是不是清零。
管家也不会将你归还的水桶倒倒干清(他有那么多水桶,每个归还都倒干净岂不累死了)。反正其他用的时候自己会处理的啦。
free之后将指针清零只是提醒自己,这些水桶已经不是我的了,不要再完里面放水了,^_^
如果free了之后还用那个指针的话,就有可能管家已经将这些水桶给了其他人装饮料的了,你却往里面撒了泡尿。好的管家可能会对你的行为表示强烈的不满, 杀了你(非法操作)--这是最好的结果,你知道自己错了(有错就改嘛)。一些不好的管家可能忙不过来,有时候抓到你作坏事就惩罚你,有时候却不知道去那里 了--这是你的恶梦,不知道什么时候、怎么回事情自己就死了。不管怎么样,这种情况下很有可能有人要喝尿--不知道是你的老板还是你的客户了.^_^。
所以啊,好市民当然是还了给管家的东西就不要再占着啦,.^_^。
boywayne
异能力者
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
当你用malloc申请空间,系统会在堆里一次性给你4096个字节你用,不管你malloc里面填的什么。
free的作用并不是释放空间,而是解除对这片空间独享的权利,使其他操作也能访问这片内存空间。该内存中的数据并没有被清除掉,还是可以继续使用的。
金翅大鹏雕岳飞
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
顶
金翅大鹏雕岳飞
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
顶
金翅大鹏雕岳飞
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
顶
展臂_飞翔
团子家族
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
正确代码是int *p = (int *)malloc(sizeof(int)*len);这是因为一维数组所占的字节数是sizeof(int)*元素个数;假如你的错误做法,那么int小于等于4时,就是一个int变量,大于4时就是int数组,因为(int *)告诉指针指向sizeof(int)个字节数,即4个字节为一个int空间!假如你输入的是5,那么就危险啦!前面4个字节是一个int,还余一个字节不够一个int空间,那么就会把后面的三个不属于你的内存一块划拉用了!
Cooms
麻婆豆腐
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
围观
天魔666
麻婆豆腐
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
free() 了后记得把指针弄成 = NULL 才保险。
zeqbd
强能力者
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
不管你信不信,要想学好指针还得看下面的教程。
C语言内涵视频教程:
http://www.chuanke.com/1524013-98572.html
。教程中例9-8和例9-9分析了这个问题,但建议你从指针的概念看起。
问题的关键在于,你理解的free操作与实际的free操作不同。准则一:执行结果总是正确。准则二:根据根据执行结果分析问题。
实际的free操作不会对存储单元进行修改,只是标记这个存储存储单元可以再次分配,因此,它释放后再次以间接引用的方式访问时仍然可以得到原来的结果。
问题二:为何没有发生内存访问错误。只有访问了无权访问的存储单元时才会出现这个错误。C语言效率首先。
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示