malloc()是否具有最大返回值?

malloc()是否具有最大返回值?,c,pointers,memory,C,Pointers,Memory,malloc()返回的虚拟内存指针的size\t值是否有上限 我想知道是否可以安全地设置64位指针的最高有效位,以指示这不是指针而是文字整数。malloc返回的void*不是整数。将指针强制转换为整数并不是给您(虚拟内存)地址,而是一些必须遵循C语言标准中定义的语义的值(0表示空指针,加减与指针算术有关),但仅此而已 除此之外,您不得对转换为整数的指针的值进行任何假设。事实上,C实现很可能有权使用高位中的一些内部信息标记转换为整数的非空指针。正如@DatenWalf的回答所述,您不能对mallo

malloc()
返回的虚拟内存指针的
size\t
值是否有上限


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

malloc返回的
void*
不是整数。将指针强制转换为整数并不是给您(虚拟内存)地址,而是一些必须遵循C语言标准中定义的语义的值(0表示空指针,加减与指针算术有关),但仅此而已


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

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

但是,可以保证
malloc
将返回适合您的系统的地址。例如,在32位系统上,您将获得一个4字节对齐的指针,在64位上,您将获得一个8字节对齐的指针。这意味着您可以保证较低的2位或3位分别为零。您可以使用
memalign
来增加保证位的数量。它本质上与将元数据存储在最高有效位的效果相同。要获取/设置文本,只需将其向上/向下移位到剩余的位


然而,我不建议任何一种方法。为自己省去一些心痛,并分配多一点内存来存储标志。除非你有几十亿个,否则它真的不值得。

至于
大小\u t
,它可以保存由限制定义的值。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位窗口上,它可以返回0到2GB用户模式地址空间内的任何(地址)值,在64位窗口上,它可以返回0到8TB用户模式地址空间内的任何(地址)值

同样,在32位系统上,从WinNT 4开始,它引入了引导选项/3G。有了它,
malloc()
可以返回0到3 GB用户模式地址空间内的任何(地址)值


有关更多详细信息,请参阅Mark Russinovich的文章。

int64_t或uint64_t有什么问题?它取决于
OS
的内存映射策略,并且由于该策略是一个实现细节,因此可以在没有任何警告的情况下从一个版本更改到下一个版本。我不会依赖这些黑客。你的问题中有些东西很不清楚(至少对我来说)。假设您调用了
malloc
,它返回了新分配的内存块的地址。更改该值的MSB如何使其“指示文字字符串”。我想你的意思是“有没有任何值是从
malloc
中永远不会返回的,我可以安全地使用这些值来区分它们与
malloc
返回的值?”。这就是说,如果您提供了相关的代码(即返回指针的函数),这里可能有人会建议一种干净安全的方法来实现您的目标。您可以安全地这样做,但不能“用C”:您需要完全忘记C的抽象语义,并阅读硬件平台的指针规则(如果你愿意,你可以用C写代码,但这是一个细节)…好的,那就可以了。事实上,我有几十亿个,我已经解决了这个问题,但我很想知道更多关于
malloc()