从链表结构中检索值会给出错误的值

时间:2013-07-14 16:21:21

标签: c linked-list

我有一个创建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);

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

4 个答案:

答案 0 :(得分:2)

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

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

  • 使用strcpylist->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'字符串串起来。 strncpystrcpy更安全。