aka*_*tis 47 c c++ pointers pointer-arithmetic
对于指针变量p,p <(p + 1)是否为假是否可能?请解释一下你的答案.如果是,在哪种情况下会发生这种情况?
我想知道p + 1是否会溢出并且等于0.
例如,在64位PC上使用GCC-4.8进行C语言程序:
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);
}
Run Code Online (Sandbox Code Playgroud)
它返回:
p : 0xffffffffffffffff
p+1 : (nil)
Result : 0
Run Code Online (Sandbox Code Playgroud)
所以我相信这种情况是可能的.对于无效的指针位置,它可能发生.这是我能想到的唯一解决方案.还有其他人吗?
注意: 不做任何假设.考虑任何可能发生这种情况的编译器/平台/架构/操作系统.
Mik*_*our 44
对于指针变量
p,它是否可能p<(p+1)是假的?
如果p指向正确类型的有效对象(即根据C++对象模型创建的对象),则为no.p+1将指向该对象之后的内存位置,并将始终比较大于p.
否则,算术和比较的行为都是未定义的,因此结果可能是true,false或者是黄色.
如果是,在哪种情况下会发生这种情况?
它可能会,也可能不会发生
p = reinterpret_cast<char*>(numeric_limits<uintptr_t>::max);
Run Code Online (Sandbox Code Playgroud)
如果指针算法像无符号整数算术一样工作,那么这可能会导致数值溢出,p+1其值为零,并且比较小于p.或者它可能会做其他事情.
gna*_*729 10
很简单:如果没有涉及未定义的行为,就不会发生这种情况.在存在未定义的行为时,它很容易发生.有关详细信息,请阅读C标准或C++标准的副本.
因此,允许符合标准的编译器根本不评估<运算符,而是使用1或true作为结果.具有有符号整数的算术也是如此(但对于无符号整数,完全合法的代码可能使x> x + 1).
您的示例代码甚至不是C或C++,因此您似乎在不是标准符合C或C++编译器的模式下使用了编译器.