给定这段代码:
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/