免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3558 | 回复: 10
打印 上一主题 下一主题

[C] Free 的使用问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-12 15:52 |只看该作者 |倒序浏览
我看到有帖子说:
  free(p)是告诉系统前面申请的p指向的这个内存块已经不用,可以释放,但是p依然还是指向该内存的地址

那下面这两个例子我就有点不明白了:

例子1:
  char *str=NULL;
  str=malloc(20);
  strcpy(str, "hello");
  free(str);
  strcpy(str, "world");   //区别处
  printf("%s \n",str);
最后的输出结果是 world

例子2:
  char *str=NULL;
  str=malloc(20);
  strcpy(str, "hello");
  free(str);
  *(str+0)='w'; *(str+1)='o'; *(str+2)='r';      //区别处
  printf("%s \n",str);
最后的结果就是:Segmentation fault

这是为什么啊?p不是依然还是指向该内存的地址吗??

论坛徽章:
0
2 [报告]
发表于 2012-12-12 15:59 |只看该作者
free(str);后的str虽然是野指针,原来分配的内存也可能被其它人征用了,最多数据乱了,或者破坏了其它人的数据,但*(str+0)='w'; *(str+1)='o'; *(str+2)='r';      应该不会导致 Segmentation fault

求教!!

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2012-12-12 16:14 |只看该作者
指针是指针,内存是内存,两码事。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-21 06:20:00
4 [报告]
发表于 2012-12-12 16:15 |只看该作者
man 了 strcpy下。

例子1:free后,你strcpy了。str活了
例子2:free后,你没strcpy,str是死的,就段错误了。

期待高人验证。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2012-12-12 16:15 |只看该作者
free(str);
------ 自此之后,假设你再使用str指向的内容,若结果符合你的预期,编译器不会将这视为自己的功劳;若结果不符合你的预期,编译器也不会将这视为自己的过错。^_^

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2012-12-12 16:17 |只看该作者
错的没段错误,也不能证明是对了

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
7 [报告]
发表于 2012-12-12 16:27 |只看该作者
例1可以运行,例2报错又能怎样?
例1运行报错,例2可以运行又能怎样?
例1例2都能运行又能怎样?
例1例2都报错又能怎样?

能够证明或验证什么呢?

论坛徽章:
0
8 [报告]
发表于 2012-12-12 16:30 |只看该作者
hellioncu 发表于 2012-12-12 16:17
错的没段错误,也不能证明是对了



是的,最后的结果应该是不可控,这种使用方法肯定不好。只是我想知道如果“free(p)是告诉系统前面申请的p指向的这个内存块已经不用,可以释放,但是p依然还是指向该内存的地址”对的话,应该不会出现段错,因为它还至少还指向一个野地址阿?

还有就是那为什么strcpy又可以呢,strcpy里面其实也是*dst++=*str++这样赋值阿,它为什么不段错呢??

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-21 06:20:00
9 [报告]
发表于 2012-12-12 16:41 |只看该作者
The  strcpy()  function  copies the string pointed to by src (including the terminating ‘\0’ character) to
       the array pointed to by dest.  The strings may not overlap, and the destination string dest must be  large
       enough to receive the copy.


如果是这样。那str已经不是str了 。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
10 [报告]
发表于 2012-12-12 16:48 |只看该作者
z001vy3x 发表于 2012-12-12 16:30
是的,最后的结果应该是不可控,这种使用方法肯定不好。只是我想知道如果“free(p)是告诉系统前面申请 ...


这个应该跟free之后操作系统背后的动作有关,那块内存也许还属于你这个进程能访问的地址,也许不属于能访问的地址,不同的情况出现不同的结果
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP