c-Malloc失败,错误号为12



我将数据读/写到一个自定义的原始文件中,我曾在该文件中写入

version (int)
data

我实现了一种更通用的数据写入方式,现在预期的格式是

headersize (size_t)
header (headersize)
data

因此,我手动将4sizeof(int))添加到旧的原始文件(带有ghex)中,以使其与新的实现兼容。


现在,当malloc为我想从原始文件读取headerheader_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似乎正确地硬写在原始文件中,因为它等于124errno似乎表明我没有足够的内存,但当我在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没有指定宽度的类型

相关内容

  • 没有找到相关文章

最新更新