Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这个seg故障是什么意思_C_Struct_Segmentation Fault_Binaryfiles - Fatal编程技术网

C 这个seg故障是什么意思

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];

当我运行我的C程序时,我有一个分段错误,我不理解它。 我正在从包含学生结构的二进制文件中读取头文件

这就是我用gdb运行seg时遇到的seg故障

程序接收信号SIGSEGV,分段故障。 aidb.c:49处的main()中的0x0804850f 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
#包括
类型定义结构{
字符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之后,你的答案就是我问题的解决方案。谢谢各位。