【问题标题】:dynamic 2d-array - missing segmentation fault?动态二维数组 - 缺少分段错误?
【发布时间】:2020-11-23 23:47:30
【问题描述】:

我有以下代码:

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");
   }

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

【问题讨论】:

  • 您的代码调用了未定义的行为。您正在寻找没有定义的地方。无法保证您的程序会出错,或者就此而言,甚至会失败。但我可以向你保证;它将选择一个最不合时宜的时间和地点。虽然它可能似乎在您的测试夹具中运行,但可能在您教授的设备上运行,或者更糟糕的是,付费的客户环境会收获您所期望的(不幸的)行为在这里。
  • 关键是未定义的行为并不意味着崩溃。
  • @drescherjm 这就是我正在做的事情,我只是想知道为什么上面的代码在没有分段错误的情况下工作,但似乎我只是对段错误和未定义的行为感到困惑:)
  • 未定义行为的最糟糕的行为之一是当程序似乎在运行时,即使它已损坏。您在自己的环境中发现了一个这样的案例。

标签: c++ arrays dynamic-memory-allocation


【解决方案1】:

您的代码有未定义的行为

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

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

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

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多