int list_free(linklist H)
{
linklist p = NULL;
if (NULL == H)
{
return -1;
}
p = H;
printf("free:");
while (H != NULL)
{
p = H;
//printf(" %d ",H->data);
H = H->next;
//printf(" %d ",p->data);
printf(" %d ",H->data);
free(p);
}
puts("");
return 0;
}
上图为单链表释放的程序
在编译并执行程序后就会出现段错误,经过多次尝试后发现问题出现在printf(" %d ",H->data);
在排除指针H非野指针,指针H指向的内容可以正常打印,指针H指向地址有效后发现了一个(nil)字符
int list_free(linklist H)
{
linklist p = NULL;
if (NULL == H)
{
return -1;
}
p = H;
printf("free:");
p = H;
//printf(" %d ",H->data);
H = H->next;
//printf(" %d ",p->data);
printf(" %d ",H->data);
free(p);
p = H;
//printf(" %d ",H->data);
H = H->next;
//printf(" %d ",p->data);
printf(" %d ",H->data);
free(p);
while (H != NULL)
{
p = H;
//printf(" %d ",H->data);
H = H->next;
//printf(" %d ",p->data);
printf(" %d ",H->data);
free(p);
}
puts("");
return 0;
}
int list_free(linklist H)
{
linklist p = NULL;
if (NULL == H)
{
return -1;
}
p = H;
printf("free:");
while (H != NULL)
{
p = H;
H = H->next;
printf(" %p ",&p->data);// p指向H指针指向的前一个链表内容
printf(" %p ",&H->data);
free(p);
}
puts("");
return 0;
}
nil是空指针的意思,此时问题已经明显,在最后一层while循环中H = H->next;此时H指针指向了NULL,而后在执行printf(" %p ",&H->data);就会出现段错误。
此处有一点需要注意printf函数不会实时的将打印信息输出到终端上,而是将打印信息缓存到缓存区,只有遇到“\n”时才会将信息输出到终端。
下图为gdb调试有无“\n”的区别