- typedef struct _conf_line_ {
-
int line_no;
-
char *name;
-
char *value;
-
int flag; // change
-
-
struct _conf_line_ *next;
-
} CONF_LINE;
-
-
typedef struct _conf_head_node {
-
int line_num;
-
char *header;
-
int qlen;
-
CONF_LINE conf_node;
-
struct _conf_head_node *next;
-
} CONF_HEAD_NODE;
-
-
-
CONF_LINE *insert_conf_line(int line_no,char chName[],char chValue[]) {
-
-
CONF_LINE *newnode=(CONF_LINE *)malloc(sizeof(CONF_LINE));
-
if(newnode) {
-
newnode->next=NULL;
-
newnode->line_no=line_no;
-
newnode->flag=0;
-
-
newnode->name=(char *)malloc(strlen(chName)+1); //////////////////////A/////////////////////
-
if(newnode->name) {
-
strcpy(newnode->name,chName); ///////////////////////B///////////////////
-
}
-
else {
-
printf("error:no more memory for (chName)!\n");
-
getchar();
-
exit(0);
-
}
-
-
newnode->value=(char *)malloc(strlen(chValue)+1); ////////////////////////A/////////////////////
-
if(newnode->value) {
-
strcpy(newnode->value,chValue); /////////////////////////B////////////////////
-
}
-
else {
-
printf("error:no more memory for (chValue)!\n");
-
getchar();
-
exit(0);
-
}
-
-
}
-
-
else {
-
printf("error:no more memory for (CONF_LINE)!\n");
-
getchar();
-
exit(0);
-
}
-
-
return newnode;
-
}
出错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,而非数组大小.