C++ 为什么在多维数组中超出范围时会得到下一行值?

1 c++

这是我的代码,

int a[3][3] ={
            {0,1,2},
            {3,4,5},
            {6,7,8}
    };
for(int i = 0 ; i < 3 ; i ++)
        for(int j = 3 ; j>0 ; j--)
            cout << a[i-1][j] << " ";
Run Code Online (Sandbox Code Playgroud)

我期望输出是, "0 0 0 0 2 1 0 5 4"
但结果是"0 0 1 3 2 1 6 5 4"

这背后的原因是什么?

t.n*_*ese 6

这背后的原因是什么?

首先,越界数组访问是未定义的行为。所以你第一次访问awhich isa[-1][3]是无效的。

但是对于你的问题,那里发生了什么:

你可以想象你的:

int a[3][3] = {
  {0, 1, 2}, 
  {3, 4, 5},
  {6, 7, 8}
};
Run Code Online (Sandbox Code Playgroud)

在你的系统内存中有这个布局:

+---+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

您的[-1]ina[-1][3]指向arr数组之前的三个元素。

 arr[-1]     arr[0]      arr[1]
  ?           ?           ?
+---+---+---+---+---+---+---+---+---+---+---+---+
| ? | ? | ? | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+---+---+---+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

随着[3]a[-1][3]你尝试索引来访问元素3从该位置。

  0   1   2   3
+---+---+---+---+---+---+---+---+---+---+---+---+
| ? | ? | ? | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+---+---+---+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

所以,你看到的第一个值是您的第一个元素arr,接下来的两个a[-1][2]a[-1][1]“垃圾”值。

这就是您的系统上发生的事情,但请记住,这依赖于未定义的行为。