作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在追踪一些我没有编写的代码中的一些奇怪的 Coverity 错误。在一种情况下,我们在循环中使用 TAILQ_FIRST 和 TAILQ_REMOVE,如下所示:
while (!TAILQ_EMPTY(&queue))
{
item* entry = TAILQ_FIRST(&queue);
TAILQ_REMOVE(&queue, entry, next);
free(entry);
}
/usr/include/x86_64-linux-gnu/sys/queue.h
在我的 Linux 机器上)
#define TAILQ_REMOVE(head, elm, field) do { \
if (((elm)->field.tqe_next) != NULL) \
(elm)->field.tqe_next->field.tqe_prev = \
(elm)->field.tqe_prev; \
else \
(head)->tqh_last = (elm)->field.tqe_prev; \
*(elm)->field.tqe_prev = (elm)->field.tqe_next; \
} while (/*CONSTCOND*/0)
tqe_first
的内容。如果我删除头节点。因此,我会继续在我的循环中获取已删除的节点。
最佳答案
这是有效的,因为 tqe_prev
是一个指向指针的指针。如果非空,队列中的第一个元素有它的 tqe_prev
字段初始化为 tqe_first
的地址.因此,取消引用并分配给它,就像在宏的最后一行所做的那样,最终会设置 tqh_first
如果您要删除第一个元素。 (通常,tqe_prev
将具有前一个节点的 tqe_next
指针的地址。)
关于c - 为什么 TAILQ_REMOVE 不重置头指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19144439/
我正在追踪一些我没有编写的代码中的一些奇怪的 Coverity 错误。在一种情况下,我们在循环中使用 TAILQ_FIRST 和 TAILQ_REMOVE,如下所示: while (!TAILQ_EM
我是一名优秀的程序员,十分优秀!