首页 > 解决方案 > 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] << " ";

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

这背后的原因是什么?

标签: c++

解决方案


这背后的原因是什么?

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

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

你可以想象你的:

int a[3][3] = {
  {0, 1, 2}, 
  {3, 4, 5},
  {6, 7, 8}
};

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

+---+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+---+---+---+---+---+---+---+---+---+

[-1]在你的数组a[-1][3]之前点三个元素。arr

 arr[-1]     arr[0]      arr[1]
  ↓           ↓           ↓
+---+---+---+---+---+---+---+---+---+---+---+---+
| ? | ? | ? | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+---+---+---+---+---+---+---+---+---+---+---+---+

在您尝试从该位置访问索引处[3]的元素时。a[-1][3]3

  0   1   2   3
+---+---+---+---+---+---+---+---+---+---+---+---+
| ? | ? | ? | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+---+---+---+---+---+---+---+---+---+---+---+---+

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

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


推荐阅读