我想动态分配2D数组的1维(给出另一个维度)。这有用吗:
int NCOLS = 20;
// nrows = user input...
double *arr[NCOLS];
arr = (double *)malloc(sizeof(double)*nrows);
并释放它:
free(arr)
答案 0 :(得分:6)
不完全 - 你声明的是一个指针数组。你想要一个指向数组的指针,它将被声明为:
double (*arr)[NCOLS];
然后,你会像这样分配它:
arr = malloc(nrows * sizeof(double[NCOLS]));
然后可以将其视为nrows
个NCOLS
二维数组的正常free
。要释放它,只需将其传递给malloc
,就像任何其他指针一样。
在C中,不需要转换void*
的返回值,因为存在从#include <stdlib.h>
到任何指针类型的隐式转换(在C ++中不是这样)。实际上,这样做可以掩盖错误,例如由于存在隐式声明而导致失败double[20]
,因此不鼓励。
数据类型double
是“double (*)[20]
的数组20,类型double
是”指向cdecl(1)
的数组20的指针。“{{1}}程序非常有助于解密复杂的C声明(example)。
答案 1 :(得分:1)
一个例子:
#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("%d\n", (*arr)[i][j]);
}
int main(void)
{
int (*arr)[COLS];
func(&arr, 2);
free(arr);
return 0;
}
答案 2 :(得分:0)
您必须在第一维上为每个元素分配一个新数组(每个元素是一个指向数组的指针)。您可以使用循环:
for(i = 0; i < NCOLS; i++)
arr[i] = (double *)malloc(sizeof(double)*nrows);
做同样的事情以免费。