C / Pointer - 在不初始化的情况下声明局部变量指针

时间:2011-01-23 20:07:00

标签: c pointers initialization segmentation-fault

所以,我尝试过这样的事情:

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,而在第一种情况下我没有这样做。但我不明白为什么第一种情况应该是分段错误?

有人可以解释一下吗?

谢谢!

4 个答案:

答案 0 :(得分:6)

考虑如果while()条件在第一次遇到时为假,会发生什么。 prev永远不会分配任何合理的内容。

答案 1 :(得分:4)

如果while循环失败,则从不为prev赋值,因此prev-&gt; next值未定义。将tmp分配到prev会修复此问题。

答案 2 :(得分:1)

很容易。 tmp && tmp->info <= elem在第一次迭代时可能为falsenew->next = prev->next;会引发细分错误,因为prev变量未初始化

答案 3 :(得分:1)

这不会在C和C ++中编译。

  • 如果用C编译,则无法在while循环下声明变量。
  • 如果您使用C ++编译,则使用“new”关键字会出现语法错误。

原来你使用的是非标准编译器。你应该得到一个符合ISO C或ISO C ++标准!