【发布时间】:2015-12-11 16:04:36
【问题描述】:
我通过 gdb 发现这段代码中的这一行是段错误。但是我似乎不明白为什么?在发生段故障之前,它将运行 6/7 次。 Temp是链表中的一个节点,它包含一个频率(int),我用它来查找升序链表中的位置以插入一个新节点。
while (ind == 0 && temp != NULL)
{
temp = temp -> next;
if (temp -> frequency > parent_node -> frequency) /*<--- SEG FAULT HERE */
{
parent_node -> next = temp -> next; /* parent points at higher freq node */
temp -> next = parent_node; /* parent node is temp next */
ind = 1;
}
if (temp -> next == NULL)
{
temp -> next = parent_node;
ind = 1;
}
}
【问题讨论】:
-
temp = temp -> next;:temp变为NULL -
您的代码试图做什么并不完全清楚(尽管我们知道这是错误的)。
temp和parent_node在进入循环时指向什么,您希望它们在退出循环时指向什么?这两行parent_node->next = temp->next;和temp->next = parent_node;似乎正在创建一个带有两个节点的循环列表。这就是你想要的吗? -
在我的脑海中
parent_node->next = temp->next(父节点是要插入的节点),将指向 temp -> next(更大的值),temp->next = parent_node将前一个节点指向父节点,从而将父节点插入到列表中 -
请注意,二进制点
.和箭头->运算符确实绑定得非常紧密,并且在正统 C 中不应有空格。
标签: c linked-list segmentation-fault binary-tree