C指针运算

标签 c pointer-arithmetic

给定这段代码:

int *p, *q;

p = (int *) 1000;
q = (int *) 2000;

什么是 q - p 以及如何实现?

最佳答案

根据标准,它实际上是未定义的。指针算法不能保证工作,除非指针都指向同一数组中或刚好超出同一数组的元素。

标准的相关部分是 6.5.6:9(c1x 的 n1362 草案,但自 c99 以来没有改变),其中指出:

When two pointers are subtracted, both shall point to elements of the same array object, or one past the last element of the array object; the result is the difference of the subscripts of the two array elements.

如果您的 int 数据类型是 4 个字节,您很可能会得到 250,但不能保证。未定义的行为(与实现定义的行为不同)意味着未定义。任何事情都可能发生,甚至包括对大部分时空的彻底破坏。

进修类(class):

  • 定义的行为是标准规定的。实现必须这样做才能符合要求。
  • 实现定义的行为由实现决定,但必须清楚地记录该行为。如果您不太关心可移植性,请使用它。
  • 未定义的行为意味着任何事情都可能发生。永远不要那样做!

关于C指针运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2117486/

相关文章:

C : Undefined reference error

c - 向指针添加一个数字

c - 有没有办法禁止linux上的gnu malloc分配某些内存区域?

c - 我如何在 linux 中使用 objdump 和 bash 函数在共享对象文件中找到函数?

c - 在C中打印二叉树

C++ 查找文件中的所有指针算法

c - C语言有Try和Catch吗?

c++ - 迭代中的指针算法是否溢出安全?

c - 为什么要在 offsetof() 中减去空指针?