我在运行 C 程序时遇到分段错误,但我不理解它。我正在从包含学生结构的二进制文件中读取标头。
这是我使用 GDB 运行时遇到的 SEG 错误
程序接收信号SIGSEGV,分段错误。0x0804850f 在 aidb.c:49 的主 () 中49 }
我的印象是分段错误在第 49 行,但是在第 49 行只有我的主要 () 方法的右括号。这是我的代码,以防万一它有助于澄清事情:
#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];
然后,您尝试读取table
48 个大小为 sizeof(SectionHeader)
的对象。
fread(table, sizeof(SectionHeader), 48, infile);
table
中没有足够的空间来容纳那么多数据。正因为如此,你写下了你不应该写的内存。这是导致未定义行为的原因。在您的情况下,当程序从 main
返回时,未定义的行为表现为分段错误。
您可以通过更改table
的大小或更改fread
行来解决此问题。确保table
有足够的空间来读取数据。
代码中的另一个错误是 Header
的id_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