【发布时间】:2017-12-18 07:08:57
【问题描述】:
我正在尝试创建一个链表,其中每个节点都存储一个字符串,但我遇到了一个问题,即每个节点最终都在每个节点中存储了相同的确切字符串。在 main() 的末尾,我打印出存储在每个节点中的单词,它总是重复整个列表中输入的最后一个字符串。
我不知道发生了什么,因为如果我把它变成一个字符串,它工作得非常好,每个字符都存储在正确的节点中。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct wordnode {
char *word;
struct wordnode *next;
};
struct wordnode *link = NULL;
void addword(char *aword);
int main(void) {
char *aword;
int i;
for(i = 0; i < 10; i++) {
scanf(" %s", aword);
addword(aword);
}
printf("\n");
for(; link != NULL; link = link->next) {
printf("|%s ", link->word);
}
printf("|\n");
return 0;
}
void addword(char *aword) {
struct wordnode *cur, *prev, *new_node;
new_node = malloc(sizeof(struct wordnode));
new_node->word = aword;
for(cur = link, prev = NULL; cur != NULL; prev = cur, cur = cur->next) {
;
}
new_node->next = cur;
if(prev == NULL) {
link = new_node;
} else {
prev->next = new_node;
}
}
【问题讨论】:
-
您有多个问题。它从你如何使用
scanf传递一个未初始化的指针开始。scanf函数需要一些足够大的分配内存来写入输入。它本身不分配内存。 -
你应该复制输入的字符串。
-
指针不会神奇地创建内存。
char *aword未初始化并指向未定义的位置。像这样使用它会调用未定义的行为。它应该是char aword[SIZE];,以便分配一个字符数组。而且您不应该简单地复制指针 (new_node->word = aword;),而是复制指向的位置(参见strdup)。最后,在 C 中始终释放所有分配的内存是一种很好的做法。祝你练习 C 好运 ;-) ... -
您认为自己拥有的任何“有效”案例都是错觉。您正在破坏内存,以不可预知的方式破坏您的运行时环境。此代码不应按原样运行。
-
一个问题是您没有复制每个字符串,因此您保存了一个指向您将用下一个输入覆盖的数组的指针,这没有帮助。确保复制字符串 - 小心。如果可用,请使用
strdup()(如果不可用,编写自己的版本并不难——char *strdup(const char *str) { size_t len = strlen(str) + 1; char *copy = malloc(len); if (copy != 0) memmove(copy, str, len); return copy; }——如果你明白我的意思。)
标签: c string linked-list