[C] 双向循环链表宏实现的坑
来源:互联网 发布:最新域名地址 编辑:程序博客网 时间:2024/05/21 07:07
这几天在写一个基于Rateless编码的单向加速工具,
因为之前在Linux内核中看过这种宏实现的双向循环链表,
所以也就没有细细研究,直接套用了KCP中的宏定义,
然后就埋坑了。
#define IQUEUE_DEL(entry) (\ (entry)->next->prev = (entry)->prev, \ (entry)->prev->next = (entry)->next, \ (entry)->next = 0, (entry)->prev = 0)
触发bug的场景:
// qhead是一个额外的链表头部,当时队列中除此之外仅有一个元素,iqueue_del(qhead.next);
上述代码展开后:
(qhead.next)->next->prev = (qhead.next)->prev, \ (qhead.next)->prev->next = (qhead.next)->next, \ (qhead.next)->next = 0, (qhead.next)->prev = 0)
(qhead.next)->next->prev = (qhead.next)->prev, \ (qhead.next)->prev->next = (qhead.next)->next, \ // 其实,一直到这里,都是正常运行的; (qhead.next)->next = 0, (qhead.next)->prev = 0) // 但是这里,由于前面的修改,qhead.next已经不再指向队列中的头个元素, // 而是指向自身;实质上就等效于qhead->next = 0, (qhead.next)->prev = 0; // 访问NULL指针,直接crash
Fix:
tmp = qhead.next;iqueue_del(tmp);
阅读全文
0 0
- [C] 双向循环链表宏实现的坑
- 双向循环链表的C语言实现
- 双向循环链表的实现(C)
- 数据结构的C实现_双向循环链表
- c语言:双向循环链表的实现
- c语言实现的双向循环链表
- 【C++】模板实现带头节点的双向循环链表
- C语言实现双向循环链表
- c双向循环链表实现
- C语言实现双向循环链表
- C语言实现双向循环链表
- C语言实现双向循环链表
- 数据结构--双向循环链表C实现
- C语言双向循环链表实现
- C语言实现双向循环链表
- 【C++】实现双向循环链表
- c语言实现双向循环链表
- C语言 双向循环链表的实现和结构 链表 线性表的链式实现
- 对低功耗广域网络有什么困惑?先看看对LoRa的解读吧
- 模拟投硬币,一次一投
- HBuilder如何真机调试ios真机
- 快速排序的两种写法(站在巨人的肩膀上加深理解)
- 初学acmer--《算法竞赛经典入门》读书笔记(暴力专题)P182
- [C] 双向循环链表宏实现的坑
- 前端面试题整理
- 【转载】Android:获取屏幕分辨率
- 剑指offer:连续子数组的最大和
- Thymeleaf教程 (十三) 附件:基础对象和web参数访问方式。
- 基础延迟定时器原理--js
- 浅谈web应用的负载均衡、集群、高可用(HA)解决方案
- Spring技术内幕——Spring MVC与Web环境(未完)
- 教师节过了,给兄弟连战狼班Java培训老师敬礼 大家好 我是陈少 这不是教师节过了嘛,我们班的学员给兄弟连的老师都送了很多祝福,感谢老师这几个月的辛酸付出,让我们学到了很多东西,同时,老师们也不吝啬