arrays - 在二维数组的范围之外写入
问题描述
在写入二维数组中的越界索引时,我遇到了一个奇怪的行为。当您运行此代码时:
int n;
scanf("%d", &n);
int a[n][n];
for (int i = 0; i < n + 5; i++)
for (int j = 0; j < n; j++)
a[i][j] = j + i * n + 1;
for (int i = 0; i < n; i++) {
printf("\n");
for (int j = 0; j < n; j++)
printf("%3d", a[i][j]);
}
随着数组的尺寸变大,你得到的结果变得越来越奇怪(n = 4, 5 很有趣,因为 n = 7 它根本停止输出任何东西)。我猜它依赖于编译器的输出,所以我会在这里粘贴我的:
n = 4
1 2 3 4
7 8 9 10
13 14 15 16
19 20 21 22
n = 5
1 2 3 4 5
9 10 11 12 13
17 18 19 20 21
25 26 27 28 29
5 5 56422104 4
我的问题是:后台发生了什么?如何分配内存以便发生这种情况?
解决方案
在数组边界之外写入的行为是未定义的,这意味着语言定义对编译器或运行时环境没有要求以任何特定方式处理这种情况。从语言的角度来看,任何结果都同样正确,无论是核心转储、损坏的数据还是没有任何明显问题的工作。
最有可能的是,您写入的数据a[i][j]
被i >= n
调用覆盖printf
- 您正在写入内存,该内存后来成为printf
的堆栈帧的一部分,尽管可能有不同的原因。
推荐阅读
- python - 应用环视后如何应用正则表达式?
- node.js - 从 Rails 对象传递 HTML 到 Node 脚本
- ruby-on-rails - 在 Rails 控制器中编写条件过滤器的正确方法
- c# - 有没有办法在没有 JavaScript 的情况下在 Blazor 中同时使用 @onfocus 和 HTML 焦点?
- sql - ADO - 如果出现错误:如何获取有关查询行号的信息?
- javascript - 如何在 javascript 函数中获取 .asp 的页面参数?
- c - 如何为 GMP 项目制作 Makefile
- spring - Spring Boot @Import 注解可以在没有@Configuration 标签的情况下使用吗
- excel - #DIV/0 时如何计算比率!存在错误
- spring-boot - 如何使用 Spring Boot CRUD API 使用一个 POST 端点在多个表中插入数据