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

标签 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 header 中进行了搜索,但找不到任何相关内容。它是一个固定值还是有办法找出我系统上的最大值?

感谢您的帮助!

最佳答案

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

一般来说,指针没有“最大值”这样的东西。指针不是数字,<>比较甚至没有定义,除非两个指针都指向同一个(数组)对象或刚好超过它的末尾。

但我认为指针的大小 正是您要寻找的。如果你可以转换 void*指向无符号 32 位或 64 位整数的指针值,则该整数的最大值将分别为 232-1 或 264-1。

类型uintptr_t , 在 <stdint.h> 中声明, 是一个无符号整数类型,可以转换 void*uintptr_t然后再次返回一个与原始指针比较相等的值。简而言之,转换 (uintptr_t)ptr不会丢失信息。

<stdint.h>定义一个宏 UINTPTR_MAX , 这是类型 uintptr_t 的最大值.这不完全是“指针的最大值”,但它可能正是您要查找的内容。

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

<stdint.h> header 和 uintptr_t类型被 1999 标准添加到 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

将“其他内容”留作练习。

关于c - Mac OSX 上指针的最大值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20387548/

相关文章:

macos - 查找并替换为 sed 和 regex

r - write.csv() 从 Mac OS 写入的结果与从 Windows 10 写入的结果不同?

c - libmpdec mpd_qncopy 内存分配

c - 从 EEPROM 读取,并知道它不是在启动时写入的

c++ - 如何使用 MSP432 DriverLib'c C 代码编写 C++ ISR?

c++ - GCC死于试图在OSX 10.6上编译64位代码

android - 将 IntelliJ 升级到 10.5 并且 Android 构建失败 Android SDK 未指定

c++ - 从函数初始化对象地址

c - 结构体中的 malloc 和指针

c - 如果我初始化一个结构但缺少一个元素,GCC 中是否有任何标志来警告我?