我声明了一个长度为3的整型数组,并想到了下面这段代码:
int a[3];
for(int i = -2; i < 3; ++i){
a[i] = i;
cout<<a[i]<<" ";
}
这是它的输出:
-2 -1 0 1 2
看起来数组a有5个已分配的空间,而且a正处于这些空间的中间。有任何想法吗?
我声明了一个长度为3的整型数组,并想到了下面这段代码:
int a[3];
for(int i = -2; i < 3; ++i){
a[i] = i;
cout<<a[i]<<" ";
}
-2 -1 0 1 2
看起来数组a有5个已分配的空间,而且a正处于这些空间的中间。有任何想法吗?
a
和索引 i
,表达式 a[i]
等于 *(a + i)
。int a[3] = { 1, 2, 3 };
int* p = &a[1]; // Make p point to the second element
std::cout << p[-1]; // Prints the first element of a, equal to *(p - 1)
std::cout << p[ 0]; // Prints the second element of a, equal to *p
std::cout << p[ 1]; // Prints the third element of a, equal to *(p + 1)
有点图形化地看,它可以像这样:
+------+------+------+ | a[0] | a[1] | a[2] | +------+------+------+ ^ ^ ^ | | | p-1 p p+1
现在,当在数组中使用负索引时,就像问题中的a
示例一样,它会像这样:
+-----+-------+-------+------+------+------+ | ... | a[-2] | a[-1] | a[0] | a[1] | a[2] | +-----+-------+-------+------+------+------+
也就是说,在此处使用负索引将会是数组越界,并导致未定义行为。
那是你绝对不应该做的事情!C++不检查内置普通数组的边界,因此在技术上,您可以访问超出分配空间(仅为3个int而不是5个)的位置,但最终会产生错误。