C / Pointer - Объявление указателя локальной переменной без его инициализации - PullRequest
2 голосов
/ 23 января 2011

Итак, я попытался сделать что-то вроде этого:

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 ]

6 голосов
/ 23 января 2011

Рассмотрим, что произойдет, если условие while() будет ложным, когда оно встречается впервые.prev никогда не будет назначено ничего разумного.

4 голосов
/ 23 января 2011

Если ваш цикл while завершается неудачно, prev никогда не присваивается значение, и поэтому prev-> next значение не определеноНазначение tmp в prev исправляет это.

1 голос
/ 23 января 2011

Это не скомпилируется ни в C, ни в C ++.

  • Если вы скомпилировали в C, вы не сможете объявить переменную ниже цикла while.
  • Если вы скомпилировали в C ++, вы получите синтаксическую ошибку при использовании ключевого слова "new".

Оказывается, вы используете нестандартный компилятор.Вы должны получить тот, который соответствует либо стандарту ISO C, либо стандарту ISO C ++!

1 голос
/ 23 января 2011

Это легко.tmp && tmp->info <= elem может быть false на первой итерации, а new->next = prev->next; вызовет ошибку сегментации, поскольку переменная prev не инициализирована

...