【问题标题】:What does this seg fault mean这个段错误是什么意思
【发布时间】:2016-05-23 04:59:56
【问题描述】:

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

这是我使用 gdb 运行时遇到的 seg 错误

程序收到信号SIGSEGV,分段错误。 0x0804850f in main () at 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

【问题讨论】:

  • int id_chars[4]; --> char id_chars[4];, fread(table, sizeof(SectionHeader), 48, infile); : 48 --> 4
  • 检查你的infile是否为NULL。
  • 函数右括号的崩溃(通常是return 语句)通常是由于函数返回地址被覆盖,这通常是由于超出本地数组的边界引起的。
  • 你永远不会调用 fclose。

标签: c struct segmentation-fault binaryfiles


【解决方案1】:

您将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

【讨论】:

  • 我将 int id_chars[4] 更改为 char id_chars[4] 但我仍然遇到段错误。只假设有大约 4 个标题,这就是我有 SectionHeader 表 [4] 的原因;给它更大的尺寸会导致它读取不应该读取的数据吗?我需要的数据应该紧跟在 4 个 SectionHeader 对象之后
  • 非常感谢@BLUEPIXY,您的回答是我问题的解决方案。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 2018-11-29
  • 2011-03-01
  • 2012-11-06
  • 2012-10-20
相关资源
最近更新 更多