2011-01-23 61 views
2

于是,我试着做这样的事情:C /指针 - 声明一个局部变量的指针没有初始化它

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

有人能解释一下吗?

谢谢!

回答

6

考虑如果while()条件在第一次遇到时为false,会发生什么情况。永远不会分配任何明智的东西。

4

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

1

这很简单。 tmp && tmp->info <= elem可以false在第一迭代和new->next = prev->next;将提高分段故障,因为prev变量没有被初始化

1

这既不Ç也不C++不会编译。

  • 如果你用C编译,你将无法在while循环下面声明一个变量。
  • 如果使用C++进行编译,则会出现使用“new”关键字的语法错误。

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

+0

不错 - 我使用gcc 4.4.3 - 也许我必须启用C99语法检查才能符合你所说的内容,现在看起来有点松懈:) – Anonymous 2011-01-24 15:38:24