Chinaunix首页 | 论坛 | 博客
  • 博客访问: 94484
  • 博文数量: 41
  • 博客积分: 991
  • 博客等级: 准尉
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-11 19:59
文章分类

全部博文(41)

文章存档

2012年(18)

2011年(23)

分类: C/C++

2011-10-17 15:30:40

  1. typedef struct _conf_line_ {
  2.     int line_no;
  3.     char *name;
  4.     char *value;
  5.     int flag; // change

  6.     struct _conf_line_ *next;
  7. } CONF_LINE;

  8. typedef struct _conf_head_node {
  9.     int line_num;
  10.     char *header;
  11.     int qlen;    
  12.     CONF_LINE conf_node;
  13.     struct _conf_head_node *next;
  14. } CONF_HEAD_NODE;


  15. CONF_LINE *insert_conf_line(int line_no,char chName[],char chValue[]) {

  16.     CONF_LINE *newnode=(CONF_LINE *)malloc(sizeof(CONF_LINE));
  17.     if(newnode) {
  18.         newnode->next=NULL;
  19.         newnode->line_no=line_no;
  20.         newnode->flag=0;

  21.         newnode->name=(char *)malloc(strlen(chName)+1);     //////////////////////A/////////////////////
  22.         if(newnode->name) {
  23.             strcpy(newnode->name,chName);                   ///////////////////////B///////////////////
  24.         }
  25.         else {
  26.             printf("error:no more memory for (chName)!\n");
  27.             getchar();
  28.             exit(0);
  29.         }

  30.         newnode->value=(char *)malloc(strlen(chValue)+1);   ////////////////////////A/////////////////////
  31.         if(newnode->value) {
  32.             strcpy(newnode->value,chValue);                 /////////////////////////B////////////////////
  33.         }
  34.         else {
  35.             printf("error:no more memory for (chValue)!\n");
  36.             getchar();
  37.             exit(0);
  38.         }
  39.         
  40.     }

  41.     else {
  42.         printf("error:no more memory for (CONF_LINE)!\n");
  43.             getchar();
  44.             exit(0);
  45.     }

  46.     return newnode;
  47. }



出错1:在把CONF_LINE 链表插入结构CONF_HEAD_NODE时:

  CONF_HEAD_NODE *chn=NULL
   ........

   chn=(CONF_HEAD_NODE *)malloc(sizeof(CONF_HEAD_NODE));         // 给CONF_HEAD_NODE 分配内存

   chn->conf_node.next=cfh;   // cfh 是指向CONF_LINE 链表的第一个节点指针.
                               //  注意:当遍历链表释放内存时此时在free时,
                                         chn->conf_node 不用显示释放,
                                         它在free(chn)时释放
   // chn->conf_node=*cfh;     //   当遍历链表释放内存时,此时的chn->conf_node 也不用显示free,但是,指向
                                     第一个节点的cfh 得free(cfh)。

  
 
出错2:关于malloc 和 free
在上述给CONF_LINE 的name 和value 分配字段时,
我刚开始用newnode->name=(char *)malloc(sizeof(chName)+1);  // newnode->name=(char *)malloc(strlen(CchName)+1)
由于作为参数传进来的chName 此时只相当于一个指针,不是数组。所以sizeof(chName)大小是4.
在strcpy(newnode->name,chName);当chName 的大小大于5时,由于malloc() 除生成chName 大小空间R外,还另外生成管理
R信息(用于free)空间。在chName 大小大于5时,strcpy 破坏了那部分管理信息(但,newnode->name 所指地址不变),所以在free(nwenode->name)出现内存无误,程序崩溃!

注:free(p) 只释放所指内存块,但是指针 p 仍存在:
  
  free(p);
  if(p) {
   printf("p is not null\n");
 }

此时输出 p is not null 。
所以在free(p)后,应当p=NULL。
在声明指针时也应当注意: char *p=NULL; 防止出现”野指针“,即 指向不确定的内存。



总:
  malloc 和free 一定要成对出现,有malloc 的,一定要有free,且注意malloc 分配的大小,防止破坏管理分配内存的信息。当数组ar作为参数时,在函数体内,
ar只是一个指针,所以 sizeof(array)=4,而非数组大小.
阅读(2225) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~