2013-10-26 1 views
1

Я создаю Связанный список Очередь типа структуры. Проблема заключается в том, когда я объявляю объект и печатаю связанный список, который он отображает. Записывание другого предмета, и печать THEN дает мне изящество. Я использовал GDB и обнаружил, что переменные меняются на кучу искажений, и я ожидаю, что это связано с неопределенным поведением, но мне трудно понять, что мне нужно сделать, чтобы исправить эту проблему.Переменные получают после первого вызова - неопределенное поведение в C?

Вот где переменные определяются пользователем

printf("First name of employee?\n"); 
char firstName[MAX_LENGTH]; 
scanf(" %s", &firstName); 
printf("Last name?\n"); 
char lastName[MAX_LENGTH]; 
scanf(" %s", &lastName); 

if(head->next == NULL) //if there is currently no employee in the list 
    head->next = hireEmployee(head, lastName, firstName, employeeCount); 
else 
{ 
    Employee *tmp; 
    head->next = tmp; 
    while(tmp->next != NULL) 
    { 
     tmp = tmp->next; 
    } 

    hireEmployee(tmp, lastName, firstName, employeeCount); 
} 

Вот часть операции Епдиеие.

Employee *new = malloc(sizeof(Employee)); 
strcpy(new->lastName, lastName); 
strcpy(new->firstName, firstName); 

И, наконец, здесь мой метод печати.

Employee *tmp; 
tmp = head->next; 
if(head->next == NULL) 
    printf("Nothing in this list."); 
else 
{ 

    printf("%s, %s\nEmployee Number: %i\n", tmp->lastName, tmp->firstName, tmp->employeeNumber); 
    while(tmp->next != NULL) 
    { 
     printf("%s, %s\nEmployee Number: %i\n", tmp->lastName, tmp->firstName, tmp->employeeNumber); 
     tmp = tmp->next; 
    } 
} 

Что мне нужно сделать, чтобы исправить это? У меня есть идеи о том, где может возникнуть неопределенное поведение, но не знаю, что я должен делать вместо этого.

ответ

2

Эта часть является проблемой:

Employee *tmp; 

На данный момент ТМП является указателем, содержание которого не определено.

head->next = tmp; 

Теперь вы только что сохранили неопределенное содержимое в голове-> рядом.

while(tmp->next != NULL) 

И теперь вы просто разыменовали свой неопределенный указатель.