使用 fread() 函数时出现分段错误

Posted

技术标签:

【中文标题】使用 fread() 函数时出现分段错误【英文标题】:Segmentation fault when using fread() function 【发布时间】:2022-01-14 12:23:48 【问题描述】:

我有以下结构和数组

#define PAGE_SIZE 256

typedef struct frame_attribute 
    
    signed char content[PAGE_SIZE];

 frame;

frame pmemory[64];

我正在尝试通过以下方式使用 fread() 将 256 个字节读入内容数组,

fread(pmemory[id].content, sizeof(pmemory[id]), PAGE_SIZE, filePointer);

它给了我一个分段错误。我不确定是什么问题

【问题讨论】:

您只能将PAGE_SIZE 字节读入该成员,而不是(有效地)sizeof(pmemory[id]) * PAGE_SIZE 字节。另外id 必须在0...63 范围内。 同时检查fopen是否真的成功了。 【参考方案1】:

您将读取变量pmemory[id].content,其大小为PAGE_SIZEsizeof(pmemory[id]) * PAGE_SIZE 字节,实际上不小于PAGE_SIZE * PAGE_SIZE 字节

fread(pmemory[id].content, sizeof(pmemory[id]), PAGE_SIZE, filePointer);

调用未定义的行为。

你至少需要写

fread(pmemory[id].content, PAGE_SIZE, 1, filePointer);

fread(pmemory[id].content, sizeof( pmemory[id].content ), 1, filePointer);

【讨论】:

【参考方案2】:

来自男人:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

The  function  fread()  reads nmemb items of data,
each size bytes long, from the stream pointed to by stream,
storing them at the location given by ptr.

我认为问题在于您使用的是sizeof(pmemory[id]),请尝试将其更改为sizeof(signed char)

您要读取 PAGE_SIZE 项数据以保存在 signed char 数组中,因此这些项的大小必须为 signed char

【讨论】:

以上是关于使用 fread() 函数时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中创建大型数组时出现分段错误

将结构插入地图时出现分段错误

运行 zend_hash_find() 时出现分段错误

分段错误:在 C++ 中弹出向量时出现 11

[访问 我以前可以访问的功能时出现段错误

对函数进行字节编码时出现分段错误? [复制]