我写了一个C代码,它只是读取'n'行数(每行是一个包含空格的7个字母的字符串),其中'n'是用户输入的第一行。对于每个输入行,我正在创建一个链接列表节点,其中node->src作为输入行。在链表中,连续的输入行被链接在一起。
我一切都很好。期望存储在node->src中的值每次都更新为用户提供的最新输入行。这可以从我在给定代码中打印的'prev'和'current'值中看到。但是current和next的指针值是正确的。我无法在我的代码中找到问题。请帮助。我正在运行gcc编译器中的代码(Linux Ubuntu 12.04)
#include<stdio.h>
struct node {
char *src;
struct node *next;
};
int main(){
int index,n;
struct node *Head;
struct node *currNode;
Head = NULL;
struct node *newNode;
char line[8];
printf("Enter inputn");
scanf("%d",&n);
for(index = 0; index < n-1; index++){
newNode = (struct node *) malloc(sizeof(struct node));
fread(line, sizeof(line), 1, stdin);
newNode->src = line;
newNode->next = NULL;
printf("%sn",line);
if(Head == NULL){
Head = newNode;
currNode = Head;
}
else{
printf("prev %sn",currNode->src);
currNode->next = newNode;
currNode = currNode->next;
printf(" current %sn",currNode->src);
}
}
for(newNode = Head; newNode != NULL; newNode=newNode->next){
printf("%p",newNode);
printf("%p",newNode->next);
printf("%sn",newNode->src);
}
return 0;
}
问题是所有的节点src
元素都指向line
。因此,当line
的值发生变化时,所有节点的src
元素也会发生变化。
最终结果是line
中剩余的是所有节点将指向的。
要解决这个问题,每个节点src
需要指向它自己的内存:
改变:
newNode->src = line;
:
newNode->src = strdup(line);
您不仅需要为您的节点执行malloc,还需要为它的元素node->src执行malloc。或者使用struct
struct node {
char src[8];
struct node *next;
};
。并使用strcpy()为node->src赋值