gpt4 book ai didi

c - 结构中的指针奇怪的结果

转载 作者:太空宇宙 更新时间:2023-11-04 04:45:31 25 4
gpt4 key购买 nike

-下面给出的程序从输入文件中的信息中添加一个带有 id、标记和名称的学生节点。

-它使用 addToList() 创建这些学生的链表

#include<stdio.h>
#define MAXLINE 10
struct student{
int id;
char *name;
int marks;
struct student *next;
struct student *tail;
};

void addToList(int id,char *name,int marks,struct student *head){
struct student *node=(struct student *)malloc(sizeof(struct student));
node->id=id;
node->name=name;
node->marks=marks;
node->next=NULL;
head->tail->next=node;
head->tail=node;
printf("%d %s %d\n",head->id,head->name,head->marks);
}
int main(){
FILE *fp=fopen("C:/Users/Johny/Desktop/test.txt","r");
int id,marks;
char f,name[MAXLINE];
struct student *head;
f=fscanf(fp,"%d %s %d",&id,name,&marks);
if(f!=EOF){
head=(struct student *)malloc(sizeof(struct student));
head->id=id;
head->marks=marks;
head->name=name;
head->next=NULL;
head->tail=head;
}
printf("%d %s %d\n",head->id,head->name,head->marks);
while((f=fscanf(fp,"%d %s %d",&id,name,&marks))!=EOF)
addToList(id,name,marks,head);
return 0;

输入文件:

1 "J" 36
2 "O" 40
3 "H" 23
4 "N" 39
5 "Y" 78

正确的输出

1 "J" 36
1 "J" 36
1 "J" 36
1 "J" 36
1 "J" 36

当前输出

1 "J" 36
1 "O" 36
1 "H" 36
1 "N" 36
1 "Y" 36

结构的名称字段发生了什么?怎么只有这个在变化?头指针指向链表的第一个节点。预期输出必须是正确的输出。

最佳答案

错误是您没有复制而是将name 的地址分配给node->name。因此,所有节点的名称字段都指向与您在 main 中声明为 char name[MAXLINE];name 相同的字符串。

因为在 add 函数中,你正在打印指向 namehead->name,而 name 中的值是一个字符串这是最后从文件中读取的。因此 head->name 只打印从文件中读取的最后一个字符串,head->name 打印字符串 j, o h....

要更正它,您应该显式分配内存和 strcpy(node->name, name) 如下。

node->name = malloc(strlen(name) + 1);  // allocate memory
strcpy(node->name, name); // copy instead of assigning same address

关于c - 结构中的指针奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21355310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com