gpt4 book ai didi

c - 这个段错误是什么意思

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:36 24 4
gpt4 key购买 nike

当我运行我的 C 程序时出现段错误,但我无法理解它。我正在从包含学生结构的二进制文件中读取 header 。

这是我用 gdb 运行它时遇到的段错误

程序收到信号 SIGSEGV,段错误。0x0804850f in main () at aidb.c:4949

我的印象是段错误在第 49 行,但是在第 49 行只有我的 main () 方法的右括号。这是我的代码,以防万一它有助于澄清事情:

#include<stdio.h>

typedef struct {
char id_chars[4];
int file_size;
int section_table_offset;
int section_count;
} Header;


typedef struct {
int offset;
int num_entries;
int type; // legal value above
} SectionHeader;


int main(void) {


FILE *infile = fopen("file.bin", "r");

Header aidbheader;


//Reads the aidb file header
// fread(aidbheader, sizeof(Header),16, infile);
fread(&aidbheader.id_chars, sizeof(char),4, infile);
fread(&aidbheader.file_size, sizeof(int),1, infile);
fread(&aidbheader.section_table_offset, sizeof(int),1, infile);
fread(&aidbheader.section_count, sizeof(int),1, infile);

SectionHeader table[4];
fread(table, sizeof(SectionHeader), 48, infile);


printf("\nSectionHeader offset: %d \n", table[3].offset);




return 0;
} // this is line 49

最佳答案

您将 table 声明为:

SectionHeader table[4];

然后您尝试读入 48 个大小为sizeof(SectionHeader) 的对象。

fread(table, sizeof(SectionHeader), 48, infile);

中没有足够的空间来容纳那么多数据。正因为如此,你写了你不应该写的内存。这是未定义行为的原因。在您的情况下,当程序从 main 返回时,未定义的行为表现为段错误。

您可以通过更改 table 的大小或更改 fread 行来解决该问题。确保 table 有足够的空间来读取数据。

您代码中的另一个错误是 Headerid_chars 成员定义为:

int id_chars[4];

当你读入数据时,你正在使用

fread(&aidbheader.id_chars, sizeof(char), 4, infile);

这本身不会导致段错误。这是可能存在错误代码的症状。确保将 id_chars 的定义更改为

char id_chars[4];
^^^ char not int

或更改 fread 行以使用:

fread(&aidbheader.id_chars, sizeof(int), 4, infile);
^^^^ int not char

关于c - 这个段错误是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37382914/

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