我有一个创建struct的链接列表的函数。
struct words {
char * word;
words next;
};
typedef struct words s_words;
typedef words * Words;
我有一个使用此代码创建链接列表的函数
Words w = NULL; // start of the list
Words t; // temp node
if (t = (Words) malloc(sizeof(s_words))) {
t->word = a_string_created;
t->next = w;
w = t; // Adding at start of the list
}
如果我制作了printf("%s",t->word)
和printf("%s",a_string_created)
,我的价值相同。
我的问题是当我尝试从另一个函数中检索word
时。
int readWords(Words list, char * wordRead) {
if (list != NULL) {
//strcpy(wordRead,list->word);
wordRead = list->word;
return 1;
}
else {
return 0;
}
}
我无法获得readWords
中的值。其中printf("%s",list->word)
给我一个奇怪的特征。并且来自调用者函数
char rw[11]; //I've try char* rw too
readWords(aList,rw);
printf("%s",rw)
什么都不打印。
我现在已经坚持了几个小时。肯定会有一些我看不到/不理解的东西。
修改
我通过将t->word = a_string_created;
替换为strcpy(t->word, a_string_created);
部分解决了我的问题。现在,在我的printfs上,我打印了字符串值。但是,对于某些值,这个值略有变化:测试成为最佳!!
答案
将t->word = a_string_created;
更改为t->word = strdup(a_string_created);
任何人都可以帮助并向我解释我错在哪里以及为何?
答案 0 :(得分:2)
问题发生是因为你的readWords
误用缓冲区:而不是将列表中的字符串复制到其中,readWords
将其指定为指针。由于rw
是按值传递的,因此缓冲区的内容保持未初始化状态,导致由于未定义的行为导致打印输出无效。
有几种方法可以解决这个问题:
strcpy
将list->words
的内容复制到wordRead
缓冲区,或readWords
以获取指向wordRead
指针的指针,并为其指定list->words
。 strcpy
方法不太安全,除非你也考虑缓冲区的大小。指向指针的指针如下所示:
int readWords(Words list, char **wordRead) {
if (list != NULL) {
*wordRead = list->word;
return 1;
} else {
return 0;
}
}
电话看起来像这样:
char *rw;
if (readWords(aList, &rw)) {
printf("%s", rw)
}
答案 1 :(得分:1)
您正在为struct
分配内存,但未能为您的字符串分配内存。
不仅如此,您的函数还会尝试将char *
变量wordRead
设置为存储字符串的开头。但它永远不会在函数外返回这个值 - 这似乎是函数的意图。你的第二个功能应该是:
int readWords(Words list, char **wordRead) {
if (list != NULL) {
*wordRead = list->word;
return 1;
} else {
return 0;
}
}
答案 2 :(得分:0)
问题是你需要为wordRead传递一个双指针。你这样做的方法就是修改一个本地值。
所以正确的原型是int readWords(Words list, char ** wordRead)
。
答案 3 :(得分:0)
在struct
内,您需要为char*
分配。如果没有为char数据分配空间,则指针已指向垃圾。
其次strcpy
并不总是安全的,除非您明确检查要复制的数据大小,并确保最后将'\0'
字符串串起来。 strncpy
比strcpy
更安全。