当指针比较都指向同一个数组的元素时,C 标准保证指针比较的有效性,但在系统中通常如何确保这一点?
编译器可能会让您在有符号和无符号指针之间进行选择。编译器将生成进行比较的程序集。但是编译器不分配内存。例如,如果您使用有符号指针进行编译,编译器如何知道运行时不会为跨越有符号溢出中断的数组分配 block ?
最佳答案
The compiler might let you choose between signed and unsigned pointers. The compiler will be generating the assembly that does the comparison. But the compiler does not allocate the memory. For example, if you compile with signed pointers, how does the compiler know the runtime won't allocate a block for an array that spans the signed overflow break?
换句话说,典型的实现如何确保没有用户数据跨越地址 0x80000000
或 0x00000000
.那么,在流行的桌面操作系统上,您可以免费获得此保证,因为 0x00000000
在内核空间中(您的用户空间程序无法访问)和 0x80000000
是...好吧,我实际上不再了解 32 位机器了。但是在 64 位机器上,0x8000000000000000
字面上是在茫茫荒野中 — 典型的 64 位操作系统不会在 0x0000FFFFFFFFFFFF
之间的巨大范围内映射 任何东西和 0xFFFF000000000000
(source) .如果您拥有大量资源,那么将数十亿字节闲置完全没有问题。 (大量轻描淡写警告!)
现在,如果您在裸机上编程,那么您可能不能保证 &a[7] < &a[8]
.如果您在 RISC 目标(例如 PowerPC 或 V800)上编程并利用位于地址 0x0000
附近的“小数据区”,这尤其可能是真的。 (访问速度很快,因为从这些地址加载不需要通过寄存器进行间接访问)。在这种情况下,您基本上是鼓励编译器将一个变量拆分到 0x0000
中。边界(甚至更糟,允许 &v == NULL
为真),以换取有值(value)的优化。
关于c - 如何保证数组内指针比较的有效性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16531331/