0

好吧,我已经为此工作了几个小时,但无法弄清楚我的问题。我有一个双链表,当我尝试向其中添加一个新节点时,它会更改链表中的所有值。

现在这就是我所拥有的:

void createSub(sibs *root, char *name, int size) {
    if (root->subSibs == NULL) {
        root->subSibs = (sibs *)malloc(sizeof(sibs));
        root->subSibs->name = name;
        root->subSibs->time_stamp = createTimeStamp();
        root->subSibs->nextSib = NULL;
    }

    sibs *temp = root->subSibs;
    if (temp != NULL) {
        while(temp->nextSib != NULL)
            temp = temp->nextSib;
    }
    sibs *t = (sibs *)malloc(sizeof(sibs));

    t->name = name;
    t->time_stamp = createTimeStamp();
    t->nextSib = NULL;

    if(temp != NULL)
        temp->nextSib = t;

    printf("root->subSibs->name = %s\n", root->subSibs->name);
    (root->numSub)++;
}

考虑到我已经更改了一百万次,这可能并不完美。有人可以告诉我我在这里做错了什么吗?

root是我正在使用的根节点,并且subSibs是指向链表的指针。我正在做的是将名称和时间戳添加到指向的链接列表中的每个节点root->subSibs

我得到的是:

createSub(root, name1, size);

印刷:

root->subSibs1: name1;

createSub(root, name2, size);

印刷:

root->subSibs1: name2;
root->subSibs2: name2;

ETC...

这可能是一些非常愚蠢的错误,但任何帮助都会令人惊叹。我已经尝试了几个小时,只需要有人告诉我为什么它会更改名称。

另外,如果我strcpy(root->subSibsi->name, name); for i = 0-5; root->subSibs1->name打印垃圾然后root->subSibs2->name打印正确的名称,然后root->subSibs3->name打印垃圾(与 相同subSibs1->name)等等......

4

3 回答 3

4
t->name = name;

您正在复制指针。相反,您可能想要复制内存:

t->name = strdup(name);

或者:

t->name = malloc(strlen(name) + 1);
strcpy(t->name, name);
于 2012-04-16T08:31:43.030 回答
1

如果没有更多信息(比如你如何调用函数),我猜你有一个缓冲区(可能是一个 char 数组),并且每次调用createSubs. 这将使您创建的每个节点都指向同一个缓冲区,该缓冲区将始终包含最后输入的字符串。

于 2012-04-16T08:33:05.403 回答
1

在您的节点中,名称为 char *。换句话说,它可以指向某个任意内存位置。首先它有一些垃圾值,所以从程序员的角度来看它什么都没有,不能用来存储价值——这就是你所做的。

现在,如果我们分配一部分内存,大到足以存储参数char *name指向的字符串,我们可以让您的节点名称指向它。完成后,您可以将参数名称 *复制到节点名称 *

于 2012-04-16T08:39:23.577 回答