c++ - 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"
这背后的原因是什么?
解决方案
这背后的原因是什么?
首先,越界数组访问是未定义的行为。所以你的第一次访问a
是a[-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]
是“垃圾”值。
这就是您的系统上发生的情况,但请记住,这依赖于未定义的行为。
推荐阅读
- ruby-on-rails - 如何在 Ruby 中实现 JWS (RFC 7797) 签名验证?
- javascript - 如何从条带验证我的 api 密钥?
- javascript - 在固定网格区域内适合可变内容(文本或 div)
- python - Python numpy 从训练数据集中过滤标签零的简单方法
- mobile - 是否可以将 Js Interop 与 Mobile Blazor 绑定一起使用?
- grep - 在多个目录/子目录中使用 grep 并过滤掉结果?
- c++ - 在 C++20 之前将 malloc 用于 int 未定义的行为
- async-await - 意外的承诺
等待使用 axios 返回 - python - AWS python lambda - 在 lambda 中导入模块与从本地项目中导入模块的区别
- docker - “docker build” 只需要 1 个参数