Mac OSX上指针的最大值是多少?

时间:2013-12-04 22:34:56

标签: c macos pointers

我想创建一个自定义指针地址打印机(如printf(%p)),我想知道指针在我正在使用的计算机上可以拥有的最大值是多少,这是iMac OS X 10.8.5。

有人建议我使用unsigned long。以下内容是否适合使用并且足够大?

function print_address(void *pointer)
{
    unsigned long a;
    a = (unsigned long) pointer;
    [...]
}

我搜索了limits.h标题,但我找不到任何提及。它是固定值还是有办法找出我系统中的最大值?

感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

快速摘要:将指针转换为uintptr_t(在<stdint.h>中定义),这将为您提供0UINTPTR_MAX范围内的数字。继续阅读血腥细节以及理论上可能遇到的一些不太可能出现的问题。

通常,指针没有“最大值”。指针不是数字,除非两个指针指向同一个(数组)对象或刚好超过它的末尾,否则甚至不会定义<>比较。

但我认为指针的 size 确实是你正在寻找的。如果您可以将void*指针值转换为无符号的32位或64位整数,则该整数的最大值将为2 32 -1或2 64 -1。

uintptr_t中声明的类型<stdint.h>是无符号整数类型,因此将void*值转换为uintptr_t并再次返回会产生一个等于原始指针。简而言之,转化(uintptr_t)ptr不会丢失信息。

<stdint.h>定义了一个宏UINTPTR_MAX,它是uintptr_t类型的最大值。这不是“指针的最大值”,但它可能正是你所寻找的。

(在许多系统中,包括Mac OSX,指针表示为可以用作线性单片地址空间的索引的整数。这是一种常见的内存模型,但C标准实际上并不需要它。例如,某些系统可能将指针表示为描述符和偏移量的组合,这使得任意指针值之间的比较变得困难甚至不可能。)

1999标准将<stdint.h>标题和uintptr_t类型添加到C语言中。对于MacOS,您不必担心C99之前的编译器。

另请注意,uintptr_t类型是可选的。如果指针大于任何可用的整数类型,则实现将不会定义uintptr_t。同样,您不必为MacOS担心。如果你想对可移植代码狂热,那么你可以使用

#include <stdint.h>
#ifdef UINTPTR_MAX
/* uintptr_t exists */
#else
/* uintptr_t doesn't exist; do something else */
#endif

其他“别的东西”留作练习。

答案 1 :(得分:3)

您可能正在寻找UINTPTR_MAX中定义的<stdint.h>的值。

正如ouah的回答所说,uintptr_t听起来像你真正想要的类型。

答案 2 :(得分:2)

unsigned long无法保证能够表示指针值。使用uintptr_t这是一个可以保存指针值的无符号整数类型。