链表的看似不可能的输出

时间:2016-12-31 01:09:34

标签: c pointers struct linked-list

我有一个函数,它接受一个单词作为输入,并将包含该单词的结构添加到链接结构列表的末尾,每个链接结构包含一个单词和指向下一个结构的指针('节点&# 39)。但是我得到一个奇怪的输出,据我所知,这应该是不可能的(但显然不是)。

功能

void push(char* word) {
    if(first == NULL){         // if runs first time push is called
        first = malloc(46);
        first->next = NULL;
    }
    printf("first->str = %s\n", first->str);
    struct node *current = first;         //start at beginning of linked list
    while(current->next != NULL)          //find the last 'link' 
    {
        printf("running while");
        current = current->next;
    }
    current->str = word;                  
    current->next = malloc(46);
    current->next->next = NULL;
    printf("first->str after = %s\n", first->str);
    printf("current->str after = %s\n", current->str);
}

结构是

struct node {
    char* str;
    struct node* next;
};

first全局声明为:

struct node *first = NULL;

输出

first->str = (null)
first->str after = hello
current->str after = hello             //current->str = first->str
first->str = world                    // <-this should not happen
running While
first->str after = world             
current->str after = world            //current-str = first->next->str
world
world
(null)

我调用此函数然后再获取另一个单词并再次调用它。这里的第一个字是&#39;你好&#39;第二个是世界&#39;我的问题是,如果没有使用&#39; world&#39;对任何一个结构进行任何分配,那么世界如何被分配到first-&gt; str。实际上,在最后一次push调用结束和第二次push调用开始之间,没有已经完成了任何结构,但是第一次&gt; str从&#39; hello&#改变了# 39;到世界&#39;。

1 个答案:

答案 0 :(得分:1)

使用current->str = strdup(word)代替current->str = word;在销毁node->str时不要忘记释放node