记一次关于malloc free 错误 和 数组作为函数参数

2351阅读 0评论2011-10-17 kgatheko
分类:C/C++

  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,而非数组大小.
上一篇:指针参数
下一篇:char 类型指针 转化成 结构体A 指针