让我们从代码开始:
#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;
}
我一直在使用这种方法为二维阵列动态分配内存(而且我也见过很多人也使用它)并且效果很好。然而,最近我注意到它似乎分配了比预期更多的内存,我无法理解为什么。
在上面的示例中,我尝试创建一个5x5阵列。它创建恰好5行(n),如果您尝试访问除这些行以外的任何行,则会出现错误。按预期工作。大!然而,当我只想创建它时,似乎它创建了大量的列(m)。为什么这样,我该如何解决?
同样的事情似乎也适用于calloc。
谢谢!
答案 0 :(得分:2)
更改行:
matrix[i] = (int*)malloc(m*sizeof(int*));
到:
matrix[i] = (int*)malloc(m*sizeof(int));
由于matrix[i]
的类型为int *
,因此您为其分配的内存将包含int
。
但是,当我只想创建5列时,它似乎正在创建大量的列(m)
不是。您通过尝试访问内存范围之外的元素来调用undefined behaviour,因此您显示的第一个示例会意外地工作。您的代码每行只会创建5
列。