当我运行我的C程序并且我不理解它时,我有一个分段错误。 我正在从包含学生结构的二进制文件中读取标题。
这是我用gdb运行时遇到的seg错误
编程接收信号SIGSEGV,分段故障。 主要()的0x0804850f在aidb.c:49 49}
我认为分段错误位于第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
答案 0 :(得分:3)
您将table
声明为:
SectionHeader table[4];
然后,您尝试阅读table
48个大小为sizeof(SectionHeader)
的对象。
fread(table, sizeof(SectionHeader), 48, infile);
table
中没有足够的空间来容纳那么多数据。因此,你写了你不应该的内存。这是未定义行为的原因。在您的情况下,当程序从main
返回时,未定义的行为表现为分段错误。
您可以通过更改table
的尺寸或更改fread
行来解决该问题。确保table
有足够的空间来读取数据。
代码中的另一个错误是id_chars
Header
成员定义为:
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