c - 如何保证数组内指针比较的有效性?

标签 c pointers memory-management runtime

当指针比较都指向同一个数组的元素时,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?

换句话说,典型的实现如何确保没有用户数据跨越地址 0x800000000x00000000 .那么,在流行的桌面操作系统上,您可以免费获得此保证,因为 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/

相关文章:

c - C 中的 IIR 滤波器实现

C - 赋值中不兼容的类型 - 结构和字符数组

c - 分配适当的变量以使这些声明正确

c# - String 和 Char 类型如何存储在 .NET 的内存中?

arrays - 康威在 C 语言中使用 malloc 数组进行的生命游戏

复制 C 文件以包含

c - "char"类型的参数与 char* 类型的参数不兼容

c - 如何仅使用一个指针而不使用其他任何东西来比较三个字符串

c - 连续录制音频的内存问题

c - 监控/调试内存使用 C