我正在使用"代码块编辑器"和编译器"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中分配一个新空间。因此e
在load
函数中取的连续值是不同的是合理的。因此,根据注释后的下一行,不同的节点会添加到链接列表中第1行。但不同寻常的是,指针start
和指针e
一样在变化。我允许start在开始时为NULL时更改,但它仍在继续更改(查看add函数的定义)。发生了什么事?
通常,下面的行很可能是错误的:
e->name=line;
因为line
是函数中的局部变量,所以通常当函数超出范围时,e->name
会指向哪里?(使用FILE *p
0将line
的内容复制到e->name
,但在此之前,不要忘记使用malloc
或使用strdup
为e->name
分配内存)。
但特别是在您的情况下,问题似乎是每个e->name
都指向相同的内存位置:line
。(你似乎很困惑,认为=操作符复制了字符串,不,它没有,它只是让e->name
指向line
)。解决方案与上述段落中建议的类似。
另外,不要忘记分配的free
内存。