【问题标题】:C/Pointer - Declaring a local variable pointer without initializing itC/Pointer - 声明一个局部变量指针而不初始化它
【发布时间】:2011-01-23 20:06:59
【问题描述】:

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

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

有人可以解释一下吗?

谢谢!

【问题讨论】:

    标签: c pointers initialization segmentation-fault


    【解决方案1】:

    考虑如果第一次遇到while() 条件为假时会发生什么。 prev 永远不会被分配任何有意义的东西。

    【讨论】:

      【解决方案2】:

      如果你的 while 循环失败,prev 永远不会被赋值,因此 prev->next 值是未定义的。将 tmp 分配到 prev 可以解决此问题。

      【讨论】:

        【解决方案3】:

        这很容易。 tmp &amp;&amp; tmp-&gt;info &lt;= elem 在第一次迭代时可能是 false,new-&gt;next = prev-&gt;next; 会引发分段错误,因为 prev 变量未初始化

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

          • 很好 - 我正在使用 gcc 4.4.3 - 也许我必须在其中启用 C99 语法检查以符合您所说的,现在似乎有点松懈:)
          猜你喜欢
          • 1970-01-01
          • 2021-10-28
          • 2015-04-27
          • 1970-01-01
          • 2017-06-22
          • 2020-05-09
          • 2015-09-17
          • 2017-11-20
          • 1970-01-01
          相关资源
          最近更新 更多