1

我有一个创建结构链接列表的函数。

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)什么都不打印。

我已经坚持了几个小时了。肯定有一些我看不到/不理解的东西。

编辑:

我通过在我的 printfs 上替换t->word = a_string_created;为Now 部分解决了我的问题,我打印字符串值。strcpy(t->word, a_string_created);但是对于某些值,该值略有变化,例如: test 变为 uest !

回答

更改t->word = a_string_created;t->word = strdup(a_string_created);

任何人都可以帮助并向我解释我在哪里以及为什么错了?

4

4 回答 4

2

问题发生是因为您readWords滥用缓冲区:而不是将字符串从列表复制到其中,而是readWords将其分配为指针。由于rw按值传递,缓冲区的内容保持未初始化,由于未定义的行为导致无效的打印输出。

有几种方法可以解决这个问题:

  • 用于strcpy将 的内容复制list->wordswordRead缓冲区中,或
  • 更改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)
}
于 2013-07-14T16:25:40.593 回答
1

您正在struct为您的字符串分配内存,但未能为您的字符串分配内存。

不仅如此,您的函数还尝试将char *变量设置wordRead为存储字符串的开头。但它永远不会在函数之外返回这个值——这似乎是函数的意图。您的第二个功能应为:


int readWords(Words list, char **wordRead) {
    if (list != NULL) {
        *wordRead = list->word;
        return 1;
    } else {
        return 0;
    }   
}
于 2013-07-14T16:26:54.537 回答
0

问题是您需要为 wordRead 传递一个双指针。你这样做的方式,你只是修改一个本地值。

所以正确的原型是int readWords(Words list, char ** wordRead).

于 2013-07-14T16:26:53.673 回答
0

在您的内部struct,您需要分配char*. 如果没有为您的 char 数据分配空间,则您的指针已经指向垃圾。

其次strcpy并不总是安全的,除非您明确检查您尝试复制的数据的大小并确保您'\0'最后将字符串 HAS a 。strncpy比 更安全strcpy

于 2013-07-14T16:57:10.240 回答