对于一个指针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。 有其他人吗?
注意:不做任何假设。 考虑有可能发生这种情况的任何编译器/平台/架构/操作系统。
对于指针variables
p
,有可能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)
不是太大),因为在实践中 ,第一页和最后一页地址空间从不映射(但你可以强制使用mmap
& MAP_FIXED
映射)。
对于独立实现(即在内核或某个微控制器中),事情是不同的,并且具体实现(也许可能是未定义的行为或未指定的行为 )。