我想动态分配二维数组的一维(给出了另一维)。这是否工作:在C中分配一维固定的二维数组
int NCOLS = 20;
// nrows = user input...
double *arr[NCOLS];
arr = (double *)malloc(sizeof(double)*nrows);
,并释放它:
free(arr)
我想动态分配二维数组的一维(给出了另一维)。这是否工作:在C中分配一维固定的二维数组
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
2D阵列。要释放它,只需将它传递到free
就像任何其他指针一样。
在C中,不需要转换返回值malloc
,因为存在从void*
到任何指针类型的隐式转换(这在C++中不是这样)。事实上,这样做可以掩盖错误,例如由于存在隐式声明而无法执行#include <stdlib.h>
,所以不鼓励。
数据类型double[20]
是“的double
阵列20,并且类型double (*)[20]
是‘指针的double
阵列20’。该cdecl(1)
程序在能够解密复杂C声明非常有益的(example)。
谢谢!当我这样做时,我得到以下错误:错误:无效转换从'void *'到'double(*)[1]' – user308827
我的代码是:double(* arr)[NCOLS]; struct-> arr = malloc(sizeof(double [NCOLS])* nrows); – user308827
@ user308827:你是将它编译为C代码还是C++?如果是C,那么就不需要像上面所说的那样,如果你将它编译为C++,那么你需要投射结果。在这种情况下,你会将它转换为'(double(*)[NCOLS])'。 –
你必须在第一维分配一个新的数组的每个元素(每个元素是一个指针阵列)可以用于该一个循环:。
for(i = 0; i < NCOLS; i++)
arr[i] = (double *)malloc(sizeof(double)*nrows);
照此到自由
举例:
#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;
}
谢谢!当我尝试运行该程序时,出现错误:错误:从'void *'无效转换为'int(*)[2]'我该如何纠正? – user308827
根据Adam的建议修正。再次感谢! – user308827
不,这是行不通的。 – djechlin