我将数据读/写到一个自定义的原始文件中,我曾在该文件中写入
version (int)
data
我实现了一种更通用的数据写入方式,现在预期的格式是
headersize (size_t)
header (headersize)
data
因此,我手动将4
(sizeof(int)
)添加到旧的原始文件(带有ghex
)中,以使其与新的实现兼容。
现在,当malloc
为我想从原始文件读取header
的header_p
腾出空间时,我的程序失败了。
size_t headersize;
fread(&headersize, sizeof(size_t), 1, fd);
printf("%pt%dn", header_p, (int) headersize);
header_p = malloc(headersize);
printf("%pt%dt%dt%sn", header_p, (int) headersize, errno,strerror(errno));
返回
(nil) 4
(nil) 4 12 Cannot allocate memory
malloc
为什么会在这样的操作中失败?headersize
似乎正确地硬写在原始文件中,因为它等于12
的4
和errno
似乎表明我没有足够的内存,但当我在malloc
调用中硬编码sizeof(int)
时,故障不再发生。
size_t headersize;
fread(&headersize, sizeof(size_t), 1, fd);
printf("%pt%dn", header_p, (int) headersize);
header_p = malloc(sizeof(int));
printf("%pt%dt%dn", header_p, (int) headersize, errno);
返回
(nil) 4
0x8e6e90 4 0
我怀疑12的errno
隐藏了其他东西,但我不明白是什么。
这是您的问题。sizeof(size_t)
必须采用指针大小,并且可能/可能不是sizeof(int)
。如果您使用(int)
强制转换打印它,它看起来不错,因为只计算最低有效的4个字节(在您的情况下)。如果将其用于malloc()
,那么将使用整个size(size_t)
,它要么是垃圾,要么是标头的一部分。
当你在提取数字时,你应该:
- 担心endianness,并将其转换为little/bigh endian(或利用
arpa/inet.h
中的hton*) - 使用stdint.h中的特定宽度整数,永远不要pickle没有指定宽度的类型