编写链表释放产生的错误

文章描述了一段C语言代码在释放单链表时出现段错误的问题。问题出在循环中尝试访问已释放的内存,即当H指针等于NULL时,仍尝试访问H->data。解决方案是避免在释放节点后立即使用H指针。调试工具GDB揭示了这个问题,显示了有无换行符对输出的影响。
摘要由CSDN通过智能技术生成
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”的区别

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值