在C中分配一个二维数组,其中一维固定

我想动态分配2D数组的1维(给出另一个维度)。 这有用吗:

int NCOLS = 20; // nrows = user input... double *arr[NCOLS]; arr = (double *)malloc(sizeof(double)*nrows); 

并释放它:

 free(arr) 

不完全 – 你声明的是一个指针数组。 你想要一个指向数组的指针,它将被声明为:

 double (*arr)[NCOLS]; 

然后,你就像这样分配它:

 arr = malloc(nrows * sizeof(double[NCOLS])); 

然后可以通过NCOLS 2Darrays将其视为正常的nrows 。 要释放它,只需像任何其他指针一样将其传递给free

在C中,不需要转换malloc的返回值,因为从void*到任何指针类型的隐式转换(在C ++中不是这样)。 事实上,这样做可以掩盖错误,例如由于存在隐式声明而无法#include ,所以不鼓励这样做。

数据类型double[20]是“ double数组20, double double (*)[20]是指向double数组20的指针cdecl(1)程序非常有助于解密复数C声明( 例子 )。

一个例子:

 #include  #include  #define COLS 2 void func(int (**arr)[COLS], int rows) { int i, j; *arr = malloc(sizeof(int[COLS]) * rows); printf("Insert number: \n"); for(i = 0; i < rows; i++) for(j = 0; j < COLS; j++) scanf("%d", &(*arr)[i][j]); for(i = 0; i < rows; i++) for(j = 0; j < COLS; j++) printf("%d\n", (*arr)[i][j]); } int main(void) { int (*arr)[COLS]; func(&arr, 2); free(arr); return 0; } 

您必须在第一维上为每个元素(每个元素是一个指向数组的指针)分配一个新数组。 您可以使用循环:

 for(i = 0; i < NCOLS; i++) arr[i] = (double *)malloc(sizeof(double)*nrows); 

做同样的自由。