【发布时间】:2011-05-05 16:09:45
【问题描述】:
我刚刚开始学习 C,并且(似乎)到目前为止,大多数东西都是点击。但是,我在追踪双链表尝试的问题时遇到了一些麻烦。当我尝试构建/运行此代码时,我不断收到seg-fault。我正在使用 Cygwin 通过 NetBeans 提供的 gcc 进行编译。
我讨厌只转储一段代码并说“帮助”,但我不知道此时还有哪些相关的细节,所以如有必要,请随时询问细节:
#include <stdio.h>
#include <stdlib.h>
struct node_t{
struct node_t *prev;
struct node_t *next;
};
struct list_t{
struct node_t *head;
struct node_t *tail;
int length;
};
struct node_t *new_node(void);
struct list_t *new_list(void);
int append_list_node(struct list_t *list, struct node_t *node);
int main(void) {
int i = 0, length = 0;
struct node_t *node;
struct list_t *list = new_list();
for(i = 0; i < 10; i++){
length = append_list_node(list, new_node());
printf("%d", length);
}
return 0;
}
struct node_t *new_node(void){
struct node_t *node = malloc(sizeof(struct node_t));
return node;
}
struct list_t *new_list(void){
struct list_t *list = malloc(sizeof(struct list_t));
list->length = 0;
return list;
}
int append_list_node(struct list_t *list, struct node_t *new_node){
if(list->head == NULL){
list->head = new_node; // edited
new_node->prev = NULL;
}else{
list->tail->next = new_node;
new_node->prev = list->tail;
}
return (++list->length);
}
感谢大家的超级快速回复,所有答案都是正确的。当我简要查看F5-ing 之间的代码时,我意识到我没有设置tail,因此我决定将标记为edited 的行更改如下:
list->head = list->tail = new_node;
我也将决定使用calloc(),但是,我了解到频繁使用它会导致执行时间的大量成本,因为它正在清除和分配。想法?
【问题讨论】:
-
你能用 GDB 运行它并说出分段错误发生在哪里吗?
-
list->tail->next = new_node; list->tail 在第一次执行时未初始化
-
@Maz:显然在我在编辑中提到的那一行。 @yurib:谢谢,检查我的编辑,希望这是一个合理的解决方案。
标签: c linked-list segmentation-fault