malloc返回的void*不是整数.转换指向整数的指针并没有给你(虚拟内存)地址,但是必须遵守C语言标准中定义的语义的一些值(0表示空指针,加法和减法与指针算法有关) ,但这就是它.
除了那个之外,你必须对指针 - 转换为整数的值做任何假设.事实上,C实现可能很有可能将非空指针转换为整数,并在高位中包含一些内部信息.
正如 @datenwolf 的回答所述,您不能对如何为malloc您提供内存地址做出任何假设。如果您尝试使用 MSB 来存储元数据,则 MSB 很可能包含您可以覆盖的重要位。我曾在一个 32 位系统上工作,该系统返回地址,其位设置在地址的 MSB 中(不是来自malloc,而是来自其他系统特定的内存分配函数)。
但是,可以保证返回malloc一个适合您的系统的地址。例如,在 32 位系统上,您将获得 4 字节对齐的指针,而在 64 位系统上,您将获得 8 字节对齐的指针。这意味着可以保证低 2 位或 3 位分别为零。您可以通过使用来增加保证位数memalign。它本质上与将元数据存储在最高有效位中的效果相同。要获取/设置文字,您只需将其向上/向下移动到其余位即可。
但是,我不建议使用任何一种方法。省得自己心痛,多分配一点内存来存储标志。除非你有数十亿,否则真的不值得。