动态二维数组 - 缺少分段错误?
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 内有效,但是它们在数组范围内无效。所以你最终打印出周围内存中的随机垃圾。
我有以下代码:
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 内有效,但是它们在数组范围内无效。所以你最终打印出周围内存中的随机垃圾。