我在多个地方都看到过,通过这种方式分配多维数组是低效的,应该避免使用。
int main(){
int** arr2d = malloc(3*sizeof(int*));
for(int m = 0; m < 3 ; ++m){
arr2d[m] = malloc(sizeof(int)*3);
}
for(int m = 0 ; m < 3 ; ++m){
for(int n = 0; n < 3; ++n){
arr2d[m][n] = m+n;
}
}
for(int m = 0 ; m < 3 ; ++m){
for(int n = 0; n < 3; ++n){
printf("%d,",arr2d[m][n]);
}
printf("\n");
}
for(int m = 0; m < 3 ; ++m){
free(arr2d[m]);
}
free(arr2d);
return 0;
}
另一种方法是分配足够 m*n 的数组,并相应地进行索引,从而得到 2D 的概念。
int main(){
int* arr = malloc(9*sizeof(int));
for(int m = 0; m < 3; ++m){
for(int n = 0; n < 3; ++n){
int index = m*3+n;
arr[index] = m+n;
}
}
for(int m = 0; m < 3; ++m){
for(int n = 0; n < 3; ++n){
int index = m*3+n;
printf("%d,",arr[index]);
}
printf("\n");
}
free(arr);
return 0;
}
我想知道在资源使用和时间上,这真的有多大的差别? 我知道在第一个示例中总共分配了32个字节,在第二个示例中分配了27个字节。当处理更大的矩阵时,我可以看到这会有所不同,但是时间复杂度是否会改变还是无关紧要的,因为您不管怎样都需要循环m * n次? 我应该总是遵循第二个示例作为基本标准吗?
typedef int arr2d[m][n];
arr2d* matrix = (arr2d*)arr;
然后像matrix[m][n]
一样对其进行索引。 - Kayla