繁体   English   中英

Malloc因errno 12失败

[英]Malloc fails with errno 12

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

version (int)
data

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

headersize (size_t)
header (headersize)
data

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


现在,当我的计划是失败malloc -ing空间的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似乎正确地写在了原始文件中,因为它等于4errno12似乎表明我没有足够的内存,但是当我在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);

返回

(nil)   4
0x8e6e90    4   0

我怀疑12的errno号隐藏了其他内容,但我不知道是什么。

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

腌制数字时,您应该:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM