C语言 这个赛格故障是什么意思



我在运行 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有足够的空间来读取数据。

代码中的另一个错误是 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

相关内容

  • 没有找到相关文章

最新更新