首页 > 解决方案 > 在二维数组的范围之外写入

问题描述

在写入二维数组中的越界索引时,我遇到了一个奇怪的行为。当您运行此代码时:

   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

我的问题是:后台发生了什么?如何分配内存以便发生这种情况?

标签: arraysc

解决方案


在数组边界之外写入的行为是未定义的,这意味着语言定义对编译器或运行时环境没有要求以任何特定方式处理这种情况。从语言的角度来看,任何结果都同样正确,无论是核心转储、损坏的数据还是没有任何明显问题的工作。

最有可能的是,您写入的数据a[i][j]i >= n调用覆盖printf- 您正在写入内存,该内存后来成为printf的堆栈帧的一部分,尽管可能有不同的原因。


推荐阅读