从通过下标获取一个超出数组末尾的元素的地址:在C++标准中是否合法?看来,有一种特定于语言的方法可以获得比数组结尾多一个元素的地址。
如果没有解引用,为什么会超出2或2000000个元素就成为问题呢?
看一下这个简单的循环:
int array[];
...
for (int i = 0: i < array_max; ++i)
{
int * x = &array[i *2]; // Is this legal
int y=0;
if (i * 2 < array_max) // We check here before dereference
{
y = *x; // Legal dereference
}
...
}
为什么或者在什么情况下会出现未定义的情况,实际上它只是将指针设置为某个值,如果它没有被引用,为什么会变成未定义?
更具体地说,除了预期发生的事情之外,还可能有什么例外呢?
(p + 2000000000) - p
可能不等于 2000000000。 - Raymond Chen&arr[size+1]
等同于arr + size + 1
,但即使如此也是未定义行为。仅仅拥有一个指向数组外部的指针(不包括超出末尾的指针)就是未定义行为。从技术上讲,任何导致这种指针的算术运算都会导致未定义行为,因此即使是arr - 2 + 2
也是未定义行为,但这只是本评论的第一部分。 - chris