【问题标题】:Segmentation fault (core dumped) while making a list制作列表时出现分段错误(核心转储)
【发布时间】: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


【解决方案1】:

在你设置 head = NULL 时你设置了 head = NULL 并且在 while 循环中你有 if 语句 if(!head) ,witch 是 true 因为你的 head 是 NULL (false) 并且逻辑否定将使这个语句为 true 。 在那个 if 语句正文中,您试图从 NULL 复制一个值,这就是您面临分段错误的原因。

【讨论】:

  • Tnx 为您解答。但是,我将一个值复制到 null,(head->name 是目标),我认为即使 head 为 NULL 也是允许的?
猜你喜欢
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 2014-09-30
相关资源
最近更新 更多