malloc() 是否有最大 return 值?

Does malloc() have a maximum return value?

malloc()返回的虚拟内存指针的size_t值是否有上限?

我想知道我是否可以安全地设置 64 位指针的最高有效位来指示这不是指针而是文字整数。

malloc returns a void* 不是整数。将指针转换为整数并不是给你(虚拟内存)地址,而是一些必须遵守 C 语言标准中定义的语义的值(0 表示空指针,加法和减法与指针运算有关) ,仅此而已。

除此之外,您不能对指针转换为整数的值做出任何假设。事实上,C 实现很可能有权标记非空指针转换为整数,并在高位使用一些内部信息。

正如@datenwolf 的回答所述,您不能对 malloc 如何为您提供内存地址做出任何假设。 MSB 很可能包含您可以覆盖的重要位,如果您尝试使用它们来存储元数据。我曾在一个 32 位系统上工作,该系统 returned 地址的 MSB 中设置的位(不是来自 malloc,而是其他系统特定的内存分配函数)。

但是, 保证 malloc 将 return 一个与您的系统相匹配的地址。例如,在 32 位系统上,您将获得一个 4 字节对齐的指针,而在 64 位系统上,您将获得一个 8 字节对齐的指针。这意味着您可以保证低 2 位或 3 位分别 为零。您可以改为使用 memalign 来增加保证位数。它本质上与将元数据存储在最高有效位中的效果相同。对于 get/set 字面值,您只需 up/down 将其移入其余位即可。

但是,我不建议使用任何一种方法。省去一些心痛,多分配一点内存来存储标志。除非你有几十亿,否则真的不值得。

至于 size_t 而言,它可以保存由 limits.h

定义的值
#ifndef SIZE_MAX
#ifdef _WIN64 
#define SIZE_MAX _UI64_MAX
#else
#define SIZE_MAX UINT_MAX

其中_UI64_MAX和UINT_MAX定义如下。

#define UINT_MAX      0xffffffff    /* maximum unsigned int value */
#define _UI64_MAX     0xffffffffffffffffui64 

而对于 malloc() 而言,在 32 位上 Windows 它可以 return 0 到 2 GB 用户模式地址 [=34] 内的任何(地址)值=] 并且在 64 位 Windows 上它可以 return 0 到 8 TB 用户模式地址 space.

内的任何(地址)值

同样,在 32 位系统上,从 WinNT 4 开始它引入了启动选项 /3G。有了这个,malloc() 可以 return 0 到 3 GB 用户模式地址 space.

内的任何(地址)值

有关详细信息,请查看 Mark Russinovich 的文章 here