好吧,我现在已经工作了好几个小时了,无法弄清楚我的问题。我有一个双链表,当我尝试添加一个新节点时,它将更改链表中的所有值。
现在这就是我所拥有的:
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;
等...
这可能是一些非常愚蠢的错误,但任何帮助都会令人惊讶。我已经尝试了几个小时,只需要有人告诉我它为什么会改变这些名字。
此外,如果我strcpy(root->subSibsi->name, name); for i = 0-5; root->subSibs1->name
打印垃圾,然后root->subSibs2->name
打印正确的名称,然后root->subSibs3->name
打印垃圾(与subSibs1->name
相同)等等......
答案 0 :(得分:3)
t->name = name;
您正在复制指针。相反,您可能想要复制内存:
t->name = strdup(name);
或者:
t->name = malloc(strlen(name) + 1);
strcpy(t->name, name);
答案 1 :(得分:1)
没有更多信息(比如你如何调用函数)我猜你有一个缓冲区(可能是一个char数组),并且每次调用createSubs
时都会将地址传递给同一个缓冲区。这将使您创建的每个节点指向同一个缓冲区,该缓冲区将始终包含输入的最后一个字符串。
答案 2 :(得分:1)
在您的节点中,名称为char * 。换句话说,它可以指向一些任意的内存位置。首先它有一些垃圾值,所以它从程序员的角度来看都没有任何意义,也不能用来存储价值 - 这就是你所做的。
现在,如果我们分配一部分内存,大到足以存储由参数 char * name 指向的字符串,我们可以使您的节点名称指向它。完成后,您可以将参数名称* 复制到节点名称*