Malloc因errno 12而失败

时间:2015-02-23 13:49:28

标签: c file-io malloc sizeof

我将数据读/写到我曾经写过的自定义原始文件中

version (int)
data

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

headersize (size_t)
header (headersize)
data

因此,我手动将4sizeof(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似乎在原始文件中写得正确,因为它等于4errno的{​​{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 隐藏了别的东西,但我不明白是什么。

2 个答案:

答案 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)

有你的问题。 sizeof(size_t)必须使用指针大小,可能/可能不是sizeof(int)。如果使用(int)强制转换打印它,它看起来没问题,因为只评估最不重要的4个字节(在您的情况下)。如果您将其用于malloc(),则会使用整个size(size_t),并且它可能是垃圾或标题的一部分。

当你腌制数字时,你应该:

  • 担心字节序,并将其转换为小/大端(或从arpa/inet.h利用hton*
  • 使用stdint.h中的特定宽度整数,永远不会选择没有指定宽度的类型