有关如何解决此分段错误的任何建议?

时间:2017-12-04 02:52:43

标签: c

我正在读取文件“animals.dat”中的输入数据,可在此处找到https://drive.google.com/open?id=18olXBhRgpGyY0bhpjDSwla2XcBnWoFGM

我对此的指示是: 如果用户输入3,则假设输入文件animals.dat包含动物类型的记录(已定义 您需要询问用户哪个动物记录可以找到并显示在屏幕上 - 以整数表示 表示记录号。动物类型结构定义为:

#pragma pack(1)
struct animal {
    short int id;
    char name[20];
    char species[35];
    char size;
    short int age;
};

由于结构内存布局在不同的机器上不同,因此pragma pack指令强制编译器 无论平台如何,以相同的方式存储动物类型的变量(使用相同的对齐/填充)。 请注意,这种类型的搜索是使用随机文件访问,并且记录号和动物的id是 同一实体。例如,如果文件包含以下条目:

1,Allegra,Pseudois nayaur,S,5

2,未知,Ailurus fulgens,X,10

3,Athena,Moschus fuscus,X,2

然后是第3个 该文件上的记录是

3,Athena,Moschus fuscus,X,2

所有动物按其身份编号按递增顺序列出,从值1开始。如果身份证号码中有漏洞, 例如2,然后结构信息仍然存在于文件中,除了name组件包含字符串 “未知”表示空记录。确保您的搜索使用随机文件处理。 如果输入了无效的id,在本例中为1或3以外的任何值,则程序将显示错误消息。 否则,显示动物记录。在任何一种情况下,程序都将返回初始菜单。

现在,前两个选项工作正常。对于选项3,我一直在使用此代码:

#pragma pack(1)
struct animal {
    short int id;
    char name[20];
    char species[35];
    char size;
    short int age;
};
typedef struct animal* Animal;

void choice3(FILE *infile) {
    Animal tempAnimal;
    int id;
    printf("Enter ID ");
    scanf(" %d", &id);
    //fseek(infile,id * sizeof(struct animal),SEEK_SET);
    while(fread(&tempAnimal,sizeof(struct animal) - 1,1,infile) == 1) {
        printf("%d -- %s\n",tempAnimal->id,tempAnimal->name);   
    }    
}

现在,出于某种原因,我无法将任何内容存储到我的变量tempAnimal中,并且它会抛出一个分段错误:11

1 个答案:

答案 0 :(得分:2)

也许您的问题正在发生,因为Animal是指向while类型的指针。在&语句中,您已将tempAnimal置于Animal之前,以获取其内存地址。因此,您将一个双指针传递给fread()作为fread()

的第一个参数 根据文档,

ngModel将一个指针作为其第一个参数: https://www.tutorialspoint.com/c_standard_library/c_function_fread.htm