malloc()
返回的虚拟内存指针的size_t
值是否有上限?
我想知道是否可以安全地将64位指针的最高有效位设置为1,以指示这不是指针而是一个字面整数。
malloc
会提供给你内存地址的方式。最高位可能包含重要的位,如果你试图将它们用于存储元数据,则可能覆盖它们。我曾在一个32位系统上工作过,返回的地址具有设置在地址MSB中的位(不是来自malloc
,而是其他特定于系统的内存分配函数)。malloc
保证返回适合您系统对齐的地址。例如,在32位系统上,您将获得4字节对其的指针,在64位系统上,您将获得8字节对其的指针。这意味着您保证较低的2或3个位将为零。您可以通过使用memalign
来增加保证位数。这基本上与在最高有效位中存储元数据具有相同的效果。要获取/设置文字,只需将其向上/向下移位到其余位即可。malloc()
。 - ezoritasize_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上,它可以返回0到2GB用户模式地址空间内的任何(地址)值,在64位Windows上,它可以返回0到8TB用户模式地址空间内的任何(地址)值。
同样,在32位系统上,从WinNT 4开始,引入了一个启动选项/3G。使用此选项,malloc()
可以返回0到3GB用户模式地址空间内的任何(地址)值。
有关更多详细信息,请参阅Mark Russinovich的文章here。
int64_t
或uint64_t
有什么问题吗? - pmgmalloc
并且它返回了一个新分配的内存块的地址。如何通过更改该值的最高有效位使其 “指示字面字符串”?我想你的意思是 - “是否有任何值从未被malloc
返回,我可以安全地使用以将它们与 被malloc
返回的值区分开来?” 话虽如此,如果您提供相关的代码片段(即返回指针的函数),这里的某个人可能会建议一种干净安全的方法来实现您的目标。 - barak manos