C 这个seg故障是什么意思
当我运行我的C程序时,我有一个分段错误,我不理解它。 我正在从包含学生结构的二进制文件中读取头文件 这就是我用gdb运行seg时遇到的seg故障 程序接收信号SIGSEGV,分段故障。 aidb.c:49处的main()中的0x0804850f 49} 我的印象是分段错误在第49行,但是在第49行只有main()方法的右括号。 这是我的代码,以防它有助于澄清问题:C 这个seg故障是什么意思,c,struct,segmentation-fault,binaryfiles,C,Struct,Segmentation Fault,Binaryfiles,当我运行我的C程序时,我有一个分段错误,我不理解它。 我正在从包含学生结构的二进制文件中读取头文件 这就是我用gdb运行seg时遇到的seg故障 程序接收信号SIGSEGV,分段故障。 aidb.c:49处的main()中的0x0804850f 49} 我的印象是分段错误在第49行,但是在第49行只有main()方法的右括号。 这是我的代码,以防它有助于澄清问题: #include<stdio.h> typedef struct { char id_chars[4];
#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
#包括
类型定义结构{
字符id_chars[4];
int文件大小;
int段\表\偏移量;
int段_计数;
}收割台;
类型定义结构{
整数偏移量;
int num_条目;
int type;//上面的合法值
}节头;
内部主(空){
FILE*infle=fopen(“FILE.bin”,“r”);
收割台辅助装置;
//读取aidb文件头
//fread(aidbheader,sizeof(收割台),16,填充);
fread(&aidbheader.id_chars,sizeof(char),4,infle);
fread(&aidbheader.file_大小,sizeof(int),1,infle);
fread(和aidbheader.section_table_offset,sizeof(int),1,infle);
fread(和aidbheader.section_count,sizeof(int),1,infle);
章节标题表[4];
fread(表格,尺寸(截面标题),48,填充);
printf(“\n片头偏移量:%d\n”,表[3]。偏移量);
返回0;
}//这是第49行
您将表
声明为:
SectionHeader table[4];
然后尝试读入表
48个大小为sizeof(SectionHeader)
的对象
表中没有足够的空间来容纳这么多的数据。正因为如此,你写下了你不该写的记忆。这就是未定义行为的原因。在您的例子中,当程序从main
返回时,未定义的行为表现为分段错误
您可以通过更改表的大小
或更改fread
行来解决该问题。确保表
有足够的空间读取数据
代码中的另一个错误是标题
的id\u chars
成员定义为:
int id_chars[4];
当您将数据读入其中时,您正在使用
fread(&aidbheader.id_chars, sizeof(char), 4, infile);
这本身不会导致分割错误。这可能是错误代码的症状。确保将id\u chars
的定义更改为
char id_chars[4];
^^^ char not int
或者将fread
行更改为使用:
fread(&aidbheader.id_chars, sizeof(int), 4, infile);
^^^^ int not char
您将表
声明为:
SectionHeader table[4];
然后尝试读入表
48个大小为sizeof(SectionHeader)
的对象
表中没有足够的空间来容纳这么多的数据。正因为如此,你写下了你不该写的记忆。这就是未定义行为的原因。在您的例子中,当程序从main
返回时,未定义的行为表现为分段错误
您可以通过更改表的大小
或更改fread
行来解决该问题。确保表
有足够的空间读取数据
代码中的另一个错误是标题
的id\u chars
成员定义为:
int id_chars[4];
当您将数据读入其中时,您正在使用
fread(&aidbheader.id_chars, sizeof(char), 4, infile);
这本身不会导致分割错误。这可能是错误代码的症状。确保将id\u chars
的定义更改为
char id_chars[4];
^^^ char not int
或者将fread
行更改为使用:
fread(&aidbheader.id_chars, sizeof(int), 4, infile);
^^^^ int not char
int id_chars[4]代码>-->字符id_chars[4]代码>,fread(表格,尺寸(节头),48,填充)
:48
-->4
检查您的填充是否为空。函数结束括号上的崩溃(通常在return
语句上)通常是由于覆盖了函数返回地址,这通常是由于超出了本地数组的边界造成的。您从不调用fclose。int id_chars[4]代码>-->字符id_chars[4]代码>,fread(表格,尺寸(节头),48,填充)
:48
-->4
检查您的填充是否为空。函数结束括号上的崩溃(通常在return
语句上)通常是由于覆盖了函数返回地址,这通常是由于超出了本地数组的边界造成的。您从不调用fclose。我更改了int id_chars[4]到char id_chars[4],但我仍然有一个seg错误。假设只有大约4个标题,这就是我有SectionHeader表[4]的原因;给它一个更大的尺寸会导致它读取不应该读取的数据吗?我需要的数据应该在4节标题ObjectsHanks alot@BLUEPIXY之后,你的答案就是我问题的解决方案。谢谢你们。我把int-id\u-chars[4]改成了char-id\u-chars[4],但还是有seg错误。假设只有大约4个标题,这就是我有SectionHeader表[4]的原因;给它一个更大的尺寸会导致它读取不应该读取的数据吗?我需要的数据应该在4节标题ObjectsHanks alot@BLUEPIXY之后,你的答案就是我问题的解决方案。谢谢各位。