对于一个指针p,在极端情况下p <p + 1是否是假的?

对于指针variablesp ,有可能p <( p + 1 )是假的吗? 请解释你的答案。 如果是的话,在什么情况下会发生这种情况?

我想知道p + 1是否可以溢出并等于0。

例如,在一台C语言程序的GCC-4.8的64位电脑上:

int main(void) { void *p=(void *)0xFFFFFFFFFFFFFFFF; printf("p :%p\n", p); printf("p+1 :%p\n", p+1); printf("Result :%d\n", p<p+1); } 

它返回:

 p : 0xffffffffffffffff p+1 : (nil) Result : 0 

所以我认为这是可能的。 对于无效的指针位置可能会发生。 这是我能想到的唯一解决scheme。 有其他人吗?

注意:不做任何假设。 考虑有可能发生这种情况的任何编译器/平台/架构/操作系统。

对于指针variablesp ,有可能p<(p+1)是假的吗?

如果p指向正确types的有效对象(即,根据C ++对象模型创build的对象),则no。 p+1将指向该对象之后的内存位置,并将始终比较大于p

否则,算术和比较的行为都是不确定的,所以结果可能是真实的,错误的,或者是黄色的填充。

如果是的话,在什么情况下会发生这种情况?

它可能,也可能不会发生

 p = reinterpret_cast<char*>(numeric_limits<uintptr_t>::max); 

如果指针运算像无符号整数运算一样工作,那么这可能导致数字溢出,使得p+1的值为零,并比较小于p 。 或者它可能会做别的。

如果我在DOS下进行编程,而且我有一个远的指针 (一个由一个段和一个偏移量组成),它指向段中的最后一个地址,我添加一个指针,指针将环绕 ? 它看起来像当你比较它们,你规范化的指针,所以第二个指针p+1将小于p

这是一个黑暗的刺中,但我没有一个DOS C编译器,方便testing。

非常简单:如果没有未定义的行为,就不会发生。 存在不确定的行为时,可能会非常容易地发生。 有关详细信息,请阅读C标准或C ++标准的副本。

结果,允许符合的编译器根本不评估<运算符,而是使用1或者true作为结果。 对于有符号整数的算术也是如此(但对于无符号整数,对于完全合法的代码可能有x> x + 1)。

您的示例代码甚至不是C或C ++,所以您似乎已经在不符合标准的C或C ++编译器的模式下使用编译器。

这可能会发生一个无效的指针。

但是,如果指针指向一个有效的内存位置,那么在很多操作系统上(例如Linux), 实际上从不会发生 (至less如果sizeof(*p)不是太大),因为在实践中 ,第一页和最后一页地址空间从不映射(但你可以强制使用mmapMAP_FIXED映射)。

对于独立实现(即内核或某个微控制器中),事情是不同的,并且具体实现(也许可能是未定义的行为或未指定的行为 )。

看看这个:

https://stackoverflow.com/a/6702196/4000694

简述:

你不能在法律上比较C / C ++中的任意指针。 这种比较的结果没有定义。