使用 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_SIZE
sizeof(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() 函数时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章