【发布时间】: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