【发布时间】:2012-05-06 19:32:26
【问题描述】:
下面的例子是from Wikipedia。
int arr[4] = {0, 1, 2, 3};
int* p = arr + 5; // undefined behavior
如果我从不取消引用 p,那么为什么 arr + 5 单独是未定义的行为?我希望指针表现得像整数 - 除了在取消引用时指针的值被视为内存地址。
【问题讨论】:
-
我相当确定“未定义”部分只是标准的说法,它不能告诉您该指针现在指向的位置。像大多数指针“未定义”的东西一样,我确信制作它是可以的,但尊重它是非法的。
-
@EthanSteinberg:只有当他们说生成的 value 未定义时才会如此。如果 behavior 未定义,则执行它是不安全的,即使您从未取消引用它。
-
指针是不是整数。在底层,表示可能是巧合,但就“C++ 抽象机”而言,它们是完全不同的东西,它们恰好共享一些语法,例如
struct { int a; int x; }和struct { char x; }。 -
因为并非所有机器的行为方式都与您的 PC 相同。您期望某种行为取决于它在您的机器上的工作方式。标准委员会有更多的经验,并且理解其他架构以不同的方式实现指针,因此不能保证所有平台上的上述行为(因此它是未定义的)。
-
我发现这种未定义行为实际上导致计算错误的情况(在普通 x86 上):stackoverflow.com/questions/23683029/…