C ++负数组索引

时间:2017-11-08 02:43:12

标签: c++ arrays

我分配了一个包含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位于这些空间的中间。 有什么想法吗?

3 个答案:

答案 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个空格,但是你强制数组写入五个空格,即初始分配之前和之后的空格。这将在技术上有效,但绝对不推荐。你基本上是在内存中写一些东西,在大型数组中完成后会产生不良后果。