gpt4 book ai didi

c - Malloc 失败并显示 errno 12

转载 作者:行者123 更新时间:2023-11-30 15:23:43 25 4
gpt4 key购买 nike

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

version (int)
data

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

headersize (size_t)
header (headersize)
data

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

<小时/>

现在,当我想从原始文件中读取 headerheader_p 空间时,我的程序失败了.

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 似乎在原始文件中正确硬写,因为它等于 412errno 似乎是表明我没有足够的内存,但是当我在 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),并且它要么是垃圾,要么是 header 的一部分。

当你酸洗数字时,你应该:

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

关于c - Malloc 失败并显示 errno 12,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28675276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com