c-为什么在从文件加载的过程中开始指针发生变化



我正在使用"代码块编辑器"和编译器"GNU GCC"用"C"语言进行编码。我正试图使链接列表从这个结构:

struct node
{
char *name;
struct node *next;
} node;

它包含字符串名称和类型节点的指针(用于保存下一个项目的地址)

我写了以下代码:

    void load(FILE *p);
    void add(node *add);
      typedef struct node 
      {
      char *name;
      struct node *next;
      } node;
    node *start=NULL;
    int main()
    {
    FILE *p;
    *p=fopen("FILENAME","r+");
        if(p==NULL)
        {
        printf("Can not open the file");
        getch();
        return 0;
        }
    load(p);
    return 0;
    }
    void add(node *add)
    {
     node *c=start;
      if(start==NULL)
      {
      start=add;
      start->next=NULL;
      }
       else
       {
         while((c->next)!=NULL)
         {
         c=c->next;
         }
      c->next=add;
     add->next=NULL;
     }
    }
    void load(FILE *p)
    {
    char line[30],*name;
        while(!feof(p))
        {
        fscanf(p,"%s",line);
         node *e=(node *)malloc(sizeof(node));
         e->name=line;
//comment line1:next line adds e to link list
         add(e);
    printf("%s,%sn",e->name,start->name);
        }
    }

其中CCD_ 1所指向的文件是包含以下值的记事本文本文件:

#
Alex
Ali

通过运行代码,我期望看到这样的东西:

#,#
Alex,#
Ali,#

但实际上它是另一回事:

##
AlexAlex
AliAli

这意味着start全局指针随着指针e(类型为node)的变化而变化。我们知道每次运行函数malloc都会在Heap中分配一个新空间。因此eload函数中取的连续值是不同的是合理的。因此,根据注释后的下一行,不同的节点会添加到链接列表中第1行。但不同寻常的是,指针start和指针e一样在变化。我允许start在开始时为NULL时更改,但它仍在继续更改(查看add函数的定义)。发生了什么事?

通常,下面的行很可能是错误的:

 e->name=line;

因为line是函数中的局部变量,所以通常当函数超出范围时,e->name会指向哪里?(使用FILE *p0将line的内容复制到e->name,但在此之前,不要忘记使用malloc或使用strdupe->name分配内存)。

但特别是在您的情况下,问题似乎是每个e->name都指向相同的内存位置:line。(你似乎很困惑,认为=操作符复制了字符串,不,它没有,它只是让e->name指向line)。解决方案与上述段落中建议的类似。

另外,不要忘记分配的free内存。

相关内容

  • 没有找到相关文章