c -链表节点属性每次都用最近的值更新



我写了一个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赋值

相关内容

  • 没有找到相关文章

最新更新