让我们从代码开始:
#include <stdio.h>
#include <stdlib.h>
int main (void) {
int** matrix;
int n = 5;
int m = 5;
matrix = (int**)malloc(n*sizeof(int*));
for (int i = 0; i < n; i++) {
matrix[i] = (int*)malloc(m*sizeof(int*));
}
//This works:
matrix[4][90] = 50;
printf("%d", matrix[4][90]);
//This produces an error:
//matrix[5][90] = 50;
//printf("%d", matrix[5][90]);
return 0;
}
我一直在使用这种方法为 2d 数组动态分配内存(我也看到很多人使用它(,效果很好。但是,最近我注意到它似乎分配了比预期更多的内存,我不明白为什么。
在上面的示例中,我正在尝试创建一个 5x5 数组。它正好创建 5 行 (n(,如果您尝试访问这些行以外的任何行,则会出错。按预期工作。伟大!但是,它似乎正在创建大量列 (m(,而我只希望它创建 5 列。为什么会这样,我该如何解决?
同样的事情似乎也适用于卡洛克。
谢谢!
更改行:
matrix[i] = (int*)malloc(m*sizeof(int*));
自:
matrix[i] = (int*)malloc(m*sizeof(int));
由于matrix[i]
属于 int *
类型,因此您为其分配的内存将包含 int
。
但是,当我只希望它创建 5 个列时,它似乎正在创建大量列 (m(
不是。您通过尝试访问内存范围之外的元素来调用未定义的行为,因此您展示的第一个示例意外工作。代码每行只会创建 5
列。