【C/数据结构】学习笔记 之 链表中的free函数

本文描述了一位学习者在实现单链表的display和getLength函数时遇到的问题。在尝试释放链表节点时,由于误用free导致了p指针也被释放,从而引发程序中断。通过调试发现,free(f)语句是问题所在,移除free后,两个函数可以正常运行。temp未受影响是因为在free前已经更新了其值。
摘要由CSDN通过智能技术生成

今天跟着解学武老师的数据结构教程学单链表,跟着码到了这么一段:

void display(Link* p) {
    Link* temp = p;//temp指针用来遍历链表
    //只要temp指向结点的next值不是NULL,就执行输出语句。
    while (temp) {
        Link* f = temp;//准备释放链表中的结点
        printf("%d ", temp->elem);
        temp = temp->next;
        free(f);
    }
    printf("\n");
}

引用自网站源代码

就跟着学,原封不动地敲到了源代码里。突发奇想既然这个display的时间复杂度是O(n),那么照着这个思路写一个求单链表长度的函数似乎也不是不可以?于是我就照葫芦画瓢:

// 获取链表长度
int getLength(Link* p) {
	int length = 0;
	Link* temp = p;
	while (temp) {
		Link* f = temp;
		length++;
		temp = temp->next;
		free(f);
	}
	printf("链表的长度为:%d\n", length);
	return length;
}

 

在main函数里分别先后运行这两个函数,结果居然中断了!报错了!

这个报错触发原因主要是地址越界等问题。于是就开始排查错误:

①调整先后运行顺序,还是报这个错。

②重复运行display或getLength函数两次,还是报这个错。

③只运行任意一个上述函数,不报错。

所以推测错误应该发生在这两个函数运行之间,就开VCS的断点一句句看,追踪变量然后发现:

 

怎么p的值执行过程中突然变了?地址没变啊?

一句句排查后发现是free(f)这一句的问题!把f free了之后p也跟着被free了!因为p和f的地址是一样的!

把两个函数中的free语句去掉之后,两个函数就能并列正常运行了。

为什么temp没有跟着被影响?因为执行了temp=temp->next一次,逃过一劫…… 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值