请考虑以下代码段
struct node {
char *name;
int m1;
struct node *next;
};
struct node* head = 0; //start with NULL list
void addRecord(const char *pName, int ms1)
{
struct node* newNode = (struct node*) malloc(sizeof(struct node)); // allocate node
int nameLength = tStrlen(pName);
newNode->name = (char *) malloc(nameLength);
tStrcpy(newNode->name, pName);
newNode->m1 = ms1;
newNode->next = head; // link the old list off the new node
head = newNode;
}
void clear(void)
{
struct node* current = head;
struct node* next;
while (current != 0)
{
next = current->next; // note the next pointer
/* if(current->name !=0)
{
free(current->name);
}
*/
if(current !=0 )
{
free(current); // delete the node
}
current = next; // advance to the next node
}
head = 0;
}
问题: 我无法释放current->名称,只有当我评论释放名称时,程序才有效。 如果我取消注释current-> name的免费部分,我的visual studio窗口中会出现Heap损坏错误。 我怎么能自由出名?
回复:
@ all,YES,结构声明中存在拼写错误。应该是char * name和struct node * next。看起来stackoverflow编辑器夺走了这两颗星。
通过执行malloc(nameLength + 1)解决了该问题。 但是,如果我尝试在命令提示符下运行旧代码(malloc(namelength))而不是在visual studio上运行,它运行正常。 看起来,某些编译器正在进行严格的检查。
我仍然不明白的一点是,free不需要NULL终止指针,并且在这里覆盖分配指针的可能性非常小。
user2531639又名Neeraj
答案 0 :(得分:6)
这是在已分配内存的末尾写入,因为空终止字符没有空格,导致未定义的行为:
newNode->name = (char *) malloc(nameLength);
tStrcpy(newNode->name, pName);
要更正:
newNode->name = malloc(nameLength + 1);
if (newNode->name)
{
tStrcpy(newNode->name, pName);
}
注意使用NULL
指针调用free()
是安全的,因此在调用它之前检查NULL
是多余的:
free(current->name);
free(current);
此外,我假设发布的struct
定义中存在拼写错误(因为name
和next
的类型应该是指针):
struct node {
char* name;
int m1;
struct node* next;
};