免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: kewenliang
打印 上一主题 下一主题

一个常见的指针操作错误问题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2008-09-05 11:30 |只看该作者
原帖由 flw2 于 2008-9-5 11:26 发表
free(p); p = NULL;
我认为这么写不是个C语言程序员, 这也会招flw鄙视的
free之后的做法是保证不用*p


好了,借这个帖子讨论一下这个问题,我是支持free之后置NULL的,除非确认是不再使用的指针才不会进行这个操作.
比如flw2的说法,保证不用*p是很难百分之百做到的,问题在于,有人错误用了*p的时候不一定会造成程序出错,用flw的话说"错误的程序不一定有错误的结果",为了让这个操作有错误的结果,就得让p为NULL.

[ 本帖最后由 converse 于 2008-9-5 11:32 编辑 ]

论坛徽章:
0
32 [报告]
发表于 2008-09-05 11:34 |只看该作者
原帖由 converse 于 2008-9-5 11:30 发表


好了,借这个帖子讨论一下这个问题,我是支持free之后置NULL的,除非确认是不再使用的指针才不会进行这个操作.
比如flw2的说法,保证不用*p是很难百分之百做到的,问题在于,有人错误用了*p的时候不一定会造成程 ...



如过free了还*p,定义一个FREE宏好了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
33 [报告]
发表于 2008-09-05 11:44 |只看该作者
原帖由 converse 于 2008-9-5 11:30 发表

好了,借这个帖子讨论一下这个问题,我是支持free之后置NULL的,除非确认是不再使用的指针才不会进行这个操作.
比如flw2的说法,保证不用*p是很难百分之百做到的,问题在于,有人错误用了*p的时候不一定会造成程 ...

我理解你,要让你现在明白这个道理,的确有点困难,慢慢来吧。能做到哪个阶段就先做到哪个阶段。

论坛徽章:
0
34 [报告]
发表于 2008-09-05 11:51 |只看该作者
原帖由 lenky0401 于 2008-9-5 11:19 发表


不对哟 我把p=NULL后 至少下次判断if(p==NULL)的时候可以判断出P已经无效了
如果不p=NULL后 下次判断if(p==NULL)的时候还会把它当有效指针使用


你都free它了,还用它,那还有效个鬼啊。

论坛徽章:
0
35 [报告]
发表于 2008-09-05 12:17 |只看该作者
原帖由 flw 于 2008-9-5 11:44 发表

我理解你,要让你现在明白这个道理,的确有点困难,慢慢来吧。能做到哪个阶段就先做到哪个阶段。


flw,我不想骂人,请你自重,谢谢.
讨论问题应该有起码的姿态,你知道你为什么总是被人骂吗?

[ 本帖最后由 converse 于 2008-9-5 12:18 编辑 ]

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
36 [报告]
发表于 2008-09-05 12:34 |只看该作者
原帖由 converse 于 2008-9-5 12:17 发表


flw,我不想骂人,请你自重,谢谢.
讨论问题应该有起码的姿态,你知道你为什么总是被人骂吗?

因为那人是你的马甲?

论坛徽章:
0
37 [报告]
发表于 2008-09-06 00:41 |只看该作者
free(p) 后再将 p = NULL 有时候是很有用的。特别在遍历 free 整条深度链表,至少保证前提不出错

论坛徽章:
0
38 [报告]
发表于 2008-09-06 00:55 |只看该作者
原帖由 flw 于 2008-9-5 11:16 发表

严重支持!

那个题我做了80分啊
去哪里找林博士把我招进上海朗讯贝尔?

论坛徽章:
0
39 [报告]
发表于 2008-09-06 11:45 |只看该作者

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. int main(void)
  6. {
  7.         char *str = (char *) malloc(20);  //使用malloc在堆中申请20个字节的空间,返回首地址。
  8.         strcpy(str, "hello");                    //把hello放入申请的空间内,占用6个字节。
  9.         free(str);                                    //释放内存,内存管理器只是做标记,并不做额外的操作
  10.                                           //就和在硬盘删除文件一样。标记这段空间可以使用。
  11.                                           //str的值不会改变,还是指向那段空间的首地址。
  12.         strcpy(str, "world");                   //这种情况下再写入数据不会出现内存访问异常,因为空间并没有释放。
  13.                                           
  14.         char *cc = (char *) malloc(20);   //再次申请相同的空间,好的 不用费力运算了,直接把刚才释放的再给你
  15.         printf(cc);                                    //打印cc 发现内容是world。 证实以上内存分配释放策略。
  16.                                           //不过这个依赖于底层实现,不一定是这样子,只是解释你问题中的现象。
  17.                                              //另外释放之后 把指针赋0,是个好的编码习惯,后面你再用时就是访问地址0,
  18.                                           //直接抛异常。
  19.         return 0;
  20. }

复制代码

论坛徽章:
0
40 [报告]
发表于 2008-09-06 13:28 |只看该作者
原帖由 flw 于 2008-9-5 09:23 发表

对不起,看来我真的冤枉你了。
看来你真的不是骗分,
而是水平太差,建议你从现在开始再不要回答任何问题了,
好好学学别人都是怎么回答的,希望你的水平能够有所提高,不要再误导人了,谢谢!

flw,我对你的敬仰犹如滔滔江水连绵不绝啊
其实在嵌入式版,我也觉得有这么一个人的,老是给别人错误的信息,误导别人从错误的方向入手,简直浪费别人的生命
我很早就想跟他这样说了,但就是没有这样的勇气啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP