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

时间:2015-05-15 10:46:14

标签: c pointers memory

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

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

3 个答案:

答案 0 :(得分:8)

malloc返回void*而不是整数。转换指向整数的指针并没有给你(虚拟内存)地址,但是必须遵守C语言标准中定义的语义的一些值(0表示空指针,加法和减法与指针算法有关) ,但这就是它。

除此之外,你必须对指针 - cast-to-integers的值做任何假设。事实上,C实现可能很有可能将非空指针转换为整数,并在高位中包含一些内部信息。

答案 1 :(得分:4)

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

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

但是,我不会建议任何一种方法。节省一些心痛,并分配更多的内存来存储标志。除非你有数十亿,否则它真的不值得。

答案 2 :(得分:0)

至于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上它可以返回0到2 GB用户模式地址空间内的任何(地址)值,在64位Windows上它可以返回任何(地址) )0到8 TB用户模式地址空间内的值。

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

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