gpt4 book ai didi

C - 将新数据附加到链表也会更改以前的数据

转载 作者:太空宇宙 更新时间:2023-11-04 01:52:17 25 4
gpt4 key购买 nike

我是 C 的新手,偶然发现了一个问题,希望您能帮助我。

我们有一个双向链表

struct LinkedList {
LinkedListNode *first;
LinkedListNode *last;
};

以及其中的元素节点

struct LinkedListNode {
LinkedListNode *previous;
LinkedListNode *next;
char *data;
};

为了将元素附加到列表中,我编写了一个函数,它使用给定的数据在列表的末尾创建一个节点。

void append(LinkedList *list, char *data)

如果我这样调用函数,它会正常工作:

append(list, "abc");
append(list, "def");

这导致链表包含 2 个节点 - 第一个节点的数据为 "abc",第二个节点的数据为 "def"

但是,如果我将数据作为变量传递,例如用

char testData[10] = "";
strcpy(testData, "abc");
append(list, testData);
strcpy(testData, "def");
append(list, testData);

结果是 2 个链表节点,都带有数据 "def"

可能是因为第一个节点和第二个节点里面的数据指针都指向同一个内存,但是我不知道如何改变这个事实或者如何规避它。

我在函数内部传递数据的代码如下所示:

struct LinkedListNode *newNode = malloc(sizeof(struct LinkedListNode));
newNode->data = data;

希望您能帮助我,在此先感谢您。

最佳答案

该列表仅存储指向数据的指针。在第一个示例中,这些指向字符串文字的指针是不同的,但在第二个示例中,它们都指向同一位置,即数据发生变化的位置。

也许你可以试试

char testData[10] = "";
strcpy(testData, "abc");
append(list, strdup(testData));
strcpy(testData, "def");
append(list, strdup(testData));

但请记住,strdup 分配了稍后需要释放的内存。

另一种方法是在函数内复制字符串,但如果传递的字符串已经是唯一的,则会产生冗余。

newNode->data = strdup(data);

虽然函数 strdup 存在于许多库中,但它不是标准的,但很容易创建您自己的函数(感谢 David Bowling)。

关于C - 将新数据附加到链表也会更改以前的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41076525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com