所以,我尝试过这样的事情:
void place(struct node * list, int elem){
struct node *tmp = list;
struct node *prev ;
while(tmp && tmp->info <= elem){
prev = tmp;
tmp = tmp->next;
}
struct node *new = (struct node *)malloc(sizeof(struct node));
new->info = elem;
new->next = prev->next;
prev->next = new;
}
它给了我一个分段错误。 gdb没有帮助 - 显示了一个满000000和??的回溯。
但是当我尝试这个时:
void place(struct node * list, int elem){
struct node *tmp = list;
struct node *prev = tmp;
while(tmp && tmp->info <= elem){
prev = tmp;
tmp = tmp->next;
}
struct node *new = (struct node *)malloc(sizeof(struct node));
new->info = elem;
new->next = prev->next;
prev->next = new;
}
工作得很好!两者之间的唯一区别是我在第二种情况下初始化局部变量指针prev,而在第一种情况下我没有这样做。但我不明白为什么第一种情况应该是分段错误?
有人可以解释一下吗?
谢谢!
答案 0 :(得分:6)
考虑如果while()
条件在第一次遇到时为假,会发生什么。 prev
永远不会分配任何合理的内容。
答案 1 :(得分:4)
如果while循环失败,则从不为prev赋值,因此prev-&gt; next值未定义。将tmp分配到prev会修复此问题。
答案 2 :(得分:1)
很容易。 tmp && tmp->info <= elem
在第一次迭代时可能为false
而new->next = prev->next;
会引发细分错误,因为prev
变量未初始化
答案 3 :(得分:1)
这不会在C和C ++中编译。
原来你使用的是非标准编译器。你应该得到一个符合ISO C或ISO C ++标准!