Malloc 失败并返回 errno 12

Malloc fails with errno 12

我 read/write 将数据保存到我曾经写过的自定义原始文件中

version (int)
data

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

headersize (size_t)
header (headersize)
data

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


现在,当我想从原始文件中读取 headerheader_p malloc-ing space 时,我的程序失败了。

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));

Returns

(nil)   4
(nil)   4   12  Cannot allocate memory

为什么 malloc 这样的操作会失败? headersize 似乎正确地硬写在原始文件中,因为它等于 4 并且 12errno 似乎表明我没有足够的内存但是当我在 malloc 调用中硬编码 sizeof(int),故障不再发生。

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);

Returns

(nil)   4
0x8e6e90    4   0

我怀疑 12 的 errno 隐藏了其他东西,但我不明白是什么。

这是你的问题。 sizeof(size_t) 必须取指针大小,may/may 不能是 sizeof(int)。如果您使用 (int) 转换打印它,它看起来没问题,因为只评估最低有效的 4 个字节(在您的情况下)。如果你将它用于 malloc(),那么整个 size(size_t) 都会被使用,它要么是垃圾,要么是你的 header 的一部分。

当你挑选数字时,你应该:

  • 担心字节序,并将其转换为 little/big 字节序(或利用 arpa/inet.h 中的 hton*
  • 使用 stdint.h 中的 specific-width 个整数,切勿 pickle 没有指定宽度的类型