我分配了一个包含3个元素的int数组,并考虑了下面的代码:
int a[3];
for(int i = -2; i < 3; ++i){
a[i] = i;
cout<<a[i]<<" ";
}
这是它的输出:
-2 -1 0 1 2
似乎数组a有5个分配空间,而a位于这些空间的中间。 有什么想法吗?
答案 0 :(得分:3)
要解释负面索引的工作原理,首先必须学习(或记住)对于任何数组或指针a
和索引i
,表达式a[i]
等于{{ 1}}。
这意味着你可以有一个指向数组中间元素的指针,并将它与正或负索引一起使用,这是简单的算术。
示例:
*(a + i)
有点图形化,可以看作是
+------+------+------+ | a[0] | a[1] | a[2] | +------+------+------+ ^ ^ ^ | | | p-1 p p+1
答案 1 :(得分:0)
这是你永远不应该做的事情! C ++不检查内置普通数组的边界,所以从技术上讲,你可以访问超出分配空间的位置(只有3个整数而不是5个),但最终会产生错误。
答案 2 :(得分:0)
当我在自己的IDE(Visual Studio 2017)上运行它时,它引发了一个异常,指出阵列周围的堆栈已损坏。我认为正在发生的是内存中分配了3个空格,但是你强制数组写入五个空格,即初始分配之前和之后的空格。这将在技术上有效,但绝对不推荐。你基本上是在内存中写一些东西,在大型数组中完成后会产生不良后果。