免费注册 查看新帖 |

Chinaunix

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

[C] free之后,什么情况下调用会出错? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-14 16:22 |只看该作者 |倒序浏览
经常看到free一个指针后,再次引用会出错。
我写了一段代码,但是没有看到出错。
请问什么情况下程序才会出错啊?

#include <stdio.h>

int main()
{
   char *p = (char *) malloc(10);

   strcpy(p , "hello");

printf("p1  is %s\n",p);
   free(p);

printf("p2  is %s\n",p);
   if (p != NULL)
   {
       strcpy(p, "ssaadfsadf  sdfsagas   world");
   }

   printf("p3  is %s\n",p);
}




我是再linux4上运行的,cc编译器
结果如下:
[root@localhost sybase_intall]# cc t.c
[root@localhost sybase_intall]# ./a.out
p1 is hello
p2 is
p3 is ssaadfsadf  sdfsagas   world

[ 本帖最后由 XMDT 于 2008-4-14 16:33 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-04-14 16:25 |只看该作者
错误的使用不一定会马上看到后果。

论坛徽章:
0
3 [报告]
发表于 2008-04-14 16:30 |只看该作者
把输出贴上来,注明用什么平台!

论坛徽章:
0
4 [报告]
发表于 2008-04-14 16:31 |只看该作者
原帖由 cugb_cat 于 2008-4-14 16:25 发表
错误的使用不一定会马上看到后果。

能解释一下,什么情况下能看到后果吗?
还有,是不是跟编译器之类的也有关系啊

论坛徽章:
0
5 [报告]
发表于 2008-04-14 16:33 |只看该作者
sleep()一段时间后再次访问看.

另外, 你想看到效果可以free之后再次free.

论坛徽章:
0
6 [报告]
发表于 2008-04-14 16:33 |只看该作者
原帖由 XMDT 于 2008-4-14 16:31 发表

能解释一下,什么情况下能看到后果吗?
还有,是不是跟编译器之类的也有关系啊

后果就是core掉,进程崩溃。

论坛徽章:
0
7 [报告]
发表于 2008-04-14 16:35 |只看该作者
原帖由 XMDT 于 2008-4-14 16:31 发表

能解释一下,什么情况下能看到后果吗?
还有,是不是跟编译器之类的也有关系啊


当你free的那段内存被其它malloc后你就知道后果了.

论坛徽章:
0
8 [报告]
发表于 2008-04-14 16:39 |只看该作者
原帖由 XMDT 于 2008-4-14 16:31 发表

能解释一下,什么情况下能看到后果吗?
还有,是不是跟编译器之类的也有关系啊


的确跟编译器有一定的相关性

论坛徽章:
0
9 [报告]
发表于 2008-04-14 16:40 |只看该作者
#include <stdio.h>

int main()
{
   char *p = (char *) malloc(10);
   char *pxin;       //add by xin
   
   strcpy(p , "hello");
   printf("p1  is %s\n",p);
   free(p);
  
    pxin = (char *) malloc(10);          //add by xin
    strcpy(pxin, "haha");                   //add by xin
         
    printf("p2  is %s\n",p);
    if (p != NULL)
    {
           strcpy(p, "ssaadfsadf  sdfsagas   world");
     }

      printf("p3  is %s\n",p);
}

看下这个语句的输出吧,我加的在后面有注释了
free好像只是向堆中返回p指向的内存,使内存可供将来再分配
但p指针还是指向这里的,如果没有进行再分配,你再调用p
指针输出不变,但如果我再分配了,那就不一样了,
所以个人感觉最后free后把你那个p指针指为NULL,要不就可能出问题了

论坛徽章:
0
10 [报告]
发表于 2008-04-14 16:43 |只看该作者
实际上你在对原来申请的内寸开始的地址处进行操作,虽然已free,但内存的确存在,
也就是对游离的内存操作,有的编译器生成的代码会进行基本的越界检查.
free后p=NULL是一个良好的习惯!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP