我想动态分配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
2D数组将其视为普通nrows
。要释放它,只需像其他任何指针一样将其传递给free
。
在C中,无需施放malloc
的返回值,因为存在从void*
到任何指针类型的隐式铸件(在C 中这是不正确的)。实际上,由于存在隐式声明,因此这样做可以掩盖错误,例如未能#include <stdlib.h>
,因此会灰心。
数据类型double[20]
是" double
的数组20,double (*)[20]
类型为"指向double
的数组20"。cdecl(1)
程序对能够破译复杂C声明(示例)非常有帮助。
一个示例:
#include <stdio.h>
#include <stdlib.h>
#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("%dn", (*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);
做同样的事情。