动态二维数组 - 缺少分段错误?

dynamic 2d-array - missing segmentation fault?

我有以下代码:

int **a = new int*[n+1];
for(int i = 0; i <= n; i++) a[i] = new int[1];

现在 - 据我了解 - 第一个语句为 n+1 int 指针分配内存,在循环中,为每个 int 指针分配了 1 * sizeof(int) 内存(a[i] 是指针到第一个整数)。

如果我在 2 i = 0 到 n 循环中输出数组,它不会给出分段错误:

    for(int i = 0; i <= n; i++) {
      for(int j = 0; j <= n; j++)
         printf("%d ",a[i][j]);
      printf("\n");
   }

为什么我可以访问 a[i][j],其中 j > 0,因为我只为一个 int 分配了内存,而没有出现分段错误?

您的代码有 未定义的行为

创建数组时,您的循环会为外部数组中的每个 int* 指针分配一个 int[1] 数组。没关系。

稍后访问数组时,通过 a[i] 访问 int* 指针是可以的,因为 i 不会超出 a[] 数组的范围。但是 [j] 确实越界了,因为 0 是唯一可以有效访问 int[1] 数组元素的索引。

未定义的行为 不保证会发生段错误。在这种情况下,缺少段错误仅仅意味着您通过无效索引 访问的内存地址恰好 在您程序的地址 space 内有效,但是它们在数组范围内无效。所以你最终打印出周围内存中的随机垃圾。