【发布时间】:2020-10-26 22:33:53
【问题描述】:
我想创建一个列表,从数据文件中读取一些玩家的信息(名称和一些整数值)。
我想创建一个包含球员姓名并计算总分的列表。
当我尝试运行下面的代码时,出现分段错误。程序在此之后退出: strcpy(head->name,current->name) 我不知道为什么。编写此代码可能有不同的方法,但我想了解这里发生了什么。这是代码的一部分。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct playerList{
char name[31];
double points;
playerList *next;
} players;
int main()
{
FILE *o;
int p1,p2,p3;
players *head=(players*)malloc(sizeof(players)),
*current=(players*)malloc(sizeof(players)),
*previous;
head=NULL;
if((o=fopen("players.txt","r"))==NULL) {
printf("Error opening file.");
exit(1);
}
while((fgets(current->name,30,o)!=NULL)) {
fscanf(o,"%*d %*d %d %d %d",&p1,&p2,&p3);
if(!head) {
strcpy(head->name,current->name);
head->points=p1+p2*0.5+p3*0.2;
previous=head;
}
else {
current->points=p1+p2*0.5+p3*0.2;
previous->next=current;
previous=current;
}
}
return 0;
}
【问题讨论】:
-
不看, strcpy() 上的崩溃几乎总是传递给它的错误指针。仅供参考,铸造 malloc 不是一个好主意。我将等待其他人的标准链接说明原因。
-
如果 if (!head) 为真,则表示 head 为 NULL,如果您像在 if 子句中的第一条语句中那样取消引用 NULL 指针,您将崩溃跨度>
-
malloc 的 head 然后立即设置为 null 是内存泄漏。
-
另外,您的
fscanf呼叫很糟糕。您有五个格式说明符,但只有 3 个变量。 -
老实说,这段代码根本不会做得很好。您需要使用调试器逐步完成它并查看原因。通常对于链表,您创建一个新的“节点”,用数据填充它,然后将头指针链接到它并使其成为新的头。您正在将数据复制到我真的不想关注的奇怪地方。此外,始终在启用警告的情况下进行编译。 -Wall 会给出很多提示。
标签: c list file segmentation-fault