在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);
做同样的自由。