第一次调用后变量变化 - C中的未定义行为?

时间:2013-10-26 01:55:57

标签: c struct printf undefined-behavior

我正在创建一个struct类型的Linked List Queue。问题是,当我enQueue一个对象并打印链接列表时,它显示正常。排队另一个项目然后打印给我带来麻烦。我使用GDB并发现变量变得很乱,我预计这是由于未定义的行为,但我无法弄清楚我需要做些什么来解决这个问题。

这是变量由用户定义的地方

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);
}

这是enQueue操作的一部分。

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;
    }
}

我需要做些什么来解决这个问题?我知道未定义的行为可能在哪里发生,但不知道我应该做什么。

1 个答案:

答案 0 :(得分:2)

这部分是一个问题:

Employee *tmp;

此时tmp是一个内容未定义的指针。

head->next = tmp;

现在你只是将未定义的内容存储到head->下。

while(tmp->next != NULL)

现在你刚刚取消引用未定义的指针。