我想动态分配 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]));
然后可以将其视为二维数组的法线nrows
。NCOLS
要释放它,只需将它传递给free
任何其他指针。
在 C 中,没有必要强制转换 的返回值malloc
,因为void*
任何指针类型都有隐式转换(这在 C++ 中不成立)。事实上,#include <stdlib.h>
由于隐式声明的存在,这样做可以掩盖错误,例如 failed to ,因此不鼓励这样做。
数据类型double[20]
为“数组 20 of ” double
,类型double (*)[20]
为“指向数组 20 的指针double
”。该程序在破译复杂的 C 声明(示例)cdecl(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;
}
您必须为第一个维度上的每个元素(每个元素都是指向数组的指针)分配一个新数组。您可以为此使用循环:
for(i = 0; i < NCOLS; i++)
arr[i] = (double *)malloc(sizeof(double)*nrows);
做同样的事情来释放。