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"
这背后的原因是什么?
这背后的原因是什么?
首先,越界数组访问是未定义的行为。所以你第一次访问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]是“垃圾”值。
这就是您的系统上发生的事情,但请记住,这依赖于未定义的行为。