我将数据读/写到我曾经写过的自定义原始文件中
version (int)
data
我实现了一种更通用的方式来编写我的数据,现在预期的格式是
headersize (size_t)
header (headersize)
data
因此,我手动将4
(sizeof(int)
)添加到旧的原始文件(ghex
),以使其与新实现兼容。
现在,我的程序在malloc
- header_p
的空间时失败,我希望从原始文件中读取header
。
size_t headersize;
fread(&headersize, sizeof(size_t), 1, fd);
printf("%p\t%d\n", header_p, (int) headersize);
header_p = malloc(headersize);
printf("%p\t%d\t%d\t%s\n", header_p, (int) headersize, errno,strerror(errno));
返回
(nil) 4
(nil) 4 12 Cannot allocate memory
为什么malloc
会在此类操作中失败? headersize
似乎在原始文件中写得正确,因为它等于4
而errno
的{{1}}似乎表明我不是有足够的内存但是当我在12
电话上硬编码sizeof(int)
时,失败就不再发生了。
malloc
返回
size_t headersize;
fread(&headersize, sizeof(size_t), 1, fd);
printf("%p\t%d\n", header_p, (int) headersize);
header_p = malloc(sizeof(int));
printf("%p\t%d\t%d\n", header_p, (int) headersize, errno);
我怀疑12 (nil) 4
0x8e6e90 4 0
隐藏了别的东西,但我不明白是什么。
答案 0 :(得分:2)
好的,你说headersize
的类型为size_t
。
但是你在headersize
使用了错误的格式说明符:
printf("%p\t%d\n", header_p, headersize);
更多详情here
为了进一步避免undefined behaviour,您应该像这样打印header_p
:
printf("%p\t%zu\n", (void*)header_p, headersize);
答案 1 :(得分:1)