CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

关于Free的问题,不知道错在哪儿了:(

楼主Levinzhou(Levinzhou)2006-06-02 21:39:52 在 C/C++ / C语言 提问

#include   <stdio.h>  
  #include   <malloc.h>  
   
  typedef   struct   Elem  
  {  
  int   num;  
  Elem*   next;  
  }*Elem_Struct;  
   
   
  void   main()  
  {  
  Elem_Struct   temp;  
  temp   =   (Elem_Struct)malloc(sizeof(Elem_Struct));  
  temp->num   =   10;  
  temp->next   =   NULL;  
  free(temp);  
  }  
   
   
  运行这段代码,free的时候是错误的,如果把temp->next   =   NULL;去掉就可以了,为什么啊,搞不懂啊搞不懂!!!我分不多,只有给5分了:) 问题点数:5、回复次数:14Top

1 楼duduhaha(三人行必有我师)回复于 2006-06-02 22:28:07 得分 0

temp   =   (Elem_Struct)malloc(sizeof(struct   Elem));  
  你写的程序是为个指针分配空间,而不是为结构体分配空间.Top

2 楼lsea_2006()回复于 2006-06-02 22:43:32 得分 0

temp   =   (Elem_Struct)malloc(sizeof(Elem_Struct));错了!Top

3 楼qifa(DoItNow)回复于 2006-06-02 22:45:44 得分 0

同意楼上的,  
  至于你说的如果把temp->next   =   NULL;去掉就可以了,只是巧合罢了,你跟踪free函数进去你就会发现为什么了.  
  因为你为一个指针分配了4个字节的内存空间(目前指针占4个字节),紧接着后面的4个字节是堆分配结束标记fd   fd   fd   fd,如果你没有执行temp->next   =   NULL,那么标记没有被破坏,一旦你执行了temp->next   =   NULL,标记被破坏变成了00   00   00   00,就会引发错误:  
                          if   (!CheckBytes(pbData(pHead)   +   pHead->nDataSize,   _bNoMansLandFill,   nNoMansLandSize))  
                                  _RPT3(_CRT_ERROR,   "DAMAGE:   after   %hs   block   (#%d)   at   0x%p.\n",  
                                          szBlockUseName[_BLOCK_TYPE(pHead->nBlockUse)],  
                                          pHead->lRequest,  
                                          (BYTE   *)   pbData(pHead));  
  //-----------  
  此时的bCheck=253,刚好是0x0fd  
   
  static   int   __cdecl   CheckBytes(  
                  unsigned   char   *   pb,  
                  unsigned   char   bCheck,  
                  size_t   nSize  
                  )  
  {  
                  int   bOkay   =   TRUE;  
                  while   (nSize--)  
                  {  
                          if   (*pb++   !=   bCheck)  
                          {  
  /*   Internal   error   report   is   just   noise;   calling   functions   all   report   results   -   JWM   */  
  /*                                 _RPT3(_CRT_WARN,   "memory   check   error   at   0x%p   =   0x%02X,   should   be   0x%02X.\n",   */  
  /*                                         (BYTE   *)(pb-1),*(pb-1),   bCheck);   */  
                                  bOkay   =   FALSE;  
                          }  
                  }  
                  return   bOkay;  
  }Top

4 楼haolix(獾猪搂主)回复于 2006-06-02 23:06:14 得分 0

楼上的说得很好Top

5 楼lj860603(跑吧,键键)回复于 2006-06-02 23:22:31 得分 0

TO:qifa()    
   
  赞一个:)Top

6 楼oosky2004(我要好东西)回复于 2006-06-03 10:11:18 得分 0

qifa()    
   
  赞一个。Top

7 楼Levinzhou(Levinzhou)回复于 2006-06-03 13:09:25 得分 0

#include   <stdio.h>  
  #include   <malloc.h>  
   
  typedef   struct   Elem  
  {  
  int   num;  
  Elem*   next;  
  }Elem_Struct;  
   
   
  void   main()  
  {  
  Elem_Struct   *temp;  
  temp   =   (Elem_Struct*)malloc(sizeof(Elem_Struct));  
  temp->num   =   10;  
  temp->next   =   NULL;  
  free(temp);  
  }  
   
  哪为什么改成这样又是正确的呢?只不过一个定义为*Elem_Struct,一个是Elem_Struct,对temp  
  而言不都是一样的吗?Top

8 楼sarh2os()回复于 2006-06-03 13:25:06 得分 0

LZ你typedef的用法掌握的不好啊  
  typedef   struct   Elem  
  {  
  int   num;  
  Elem*   next;  
  }*Elem_Struct;  
  这句表示   Elem_Struct   代表   struct   Elem   *类型(指针类型)  
  typedef   struct   Elem  
  {  
  int   num;  
  Elem*   next;  
  }Elem_Struct;  
  这句表示   Elem_Struct   代表   struct   Elem   类型(结构体类型)  
  最开始你这句话:  
  temp   =   (Elem_Struct)malloc(sizeof(Elem_Struct));  
  错就错在没有为一个结构体而是为一个指针分配的空间。  
   
   
  Top

9 楼laiwusheng(风清扬)回复于 2006-06-03 13:31:03 得分 0

typedef   struct   Elem  
  {     ...  
  }*Elem_Struct;  
  temp   =   (Elem_Struct)malloc(sizeof(Elem_Struct));  
  分配时系统是给一个指向结构体的指针分配的空间占4字节。  
  typedef   struct   Elem  
  {     ...  
  }Elem_Struct;  
  temp   =   (Elem_Struct)malloc(sizeof(Elem_Struct));  
  此时,是给一个结构体分配的空间占6字节。  
  在编译时系统自动在结构体后加了两字节的空间,存放一些编译信息,  
  释放时产生了字节对齐的问题,无法释放。Top

10 楼Levinzhou(Levinzhou)回复于 2006-06-03 18:50:50 得分 0

找到原因了,改成这样就对了。  
  temp   =   (Elem_Struct)malloc(sizeof(Elem));  
  谢谢楼上回答的兄弟们。怎么给分啊?  
  Top

11 楼sinkileu(小心)回复于 2006-06-04 11:59:10 得分 0

typedef   struct   Elem  
  {  
  int   num;  
  Elem*   next;  
  }Elem_Struct,   *Elem_Ptr;  
   
  Elem_Ptr   =   (Elem_Ptr)malloc(sizeof(Elem_Struct));Top

12 楼sinkileu(小心)回复于 2006-06-04 12:00:33 得分 0

丢了个temp:  
   
  typedef   struct   Elem  
  {  
  int   num;  
  Elem*   next;  
  }Elem_Struct,   *Elem_Ptr;  
   
  Elem_Ptr   temp=   (Elem_Ptr)malloc(sizeof(Elem_Struct));  
  Top

13 楼voxforce(阿便)回复于 2006-06-04 14:53:26 得分 0

temp   =   (Elem_Struct)malloc(sizeof(Elem_Struct));  
  这一行错了。Top

14 楼chengzanmiao(高薪為共產當多納稅)回复于 2006-06-04 20:23:48 得分 0

duduhaha(三人行必有我师)    
  正解Top

相关问题

关键词

得分解答快速导航

  • 帖主:Levinzhou

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo