我有一个函数,它接受一个单词作为输入,并将包含该单词的结构添加到链接结构列表的末尾,每个链接结构包含一个单词和指向下一个结构的指针('节点&# 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;。
答案 0 :(得分:1)
使用current->str = strdup(word)
代替current->str = word
;在销毁node->str
时不要忘记释放node
。