在C中分配一个一维固定的二维数组
我想动态分配一个二维数组的一维(另一个维是给定的)。这是否有效:在C中分配一个一维固定的二维数组,c,arrays,2d,malloc,C,Arrays,2d,Malloc,我想动态分配一个二维数组的一维(另一个维是给定的)。这是否有效: int NCOLS = 20; // nrows = user input... double *arr[NCOLS]; arr = (double *)malloc(sizeof(double)*nrows); 要释放它: free(arr) 不完全是——您声明的是一个指针数组。您需要一个指向数组的指针,其声明如下: double (*arr)[NCOLS]; 然后,您可以这样分配它: arr = malloc(nr
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++中不是这样)。事实上,这样做可能会掩盖错误,例如由于隐式声明的存在而无法包含,因此不鼓励这样做
数据类型
double[20]
是“数组20 ofdouble
”,类型double(*)[20]
是“指向数组20 ofdouble
”。cdecl(1)
程序非常有助于破译复杂的C声明()。您必须为每个元素分配一个新数组(每个元素都是指向数组的指针)。可以使用循环:
for(i = 0; i < NCOLS; i++)
arr[i] = (double *)malloc(sizeof(double)*nrows);
(i=0;i
arr[i]=(双倍*)malloc(双倍)*nrows;
对free执行同样的操作。例如:
#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;
}
#包括
#包括
#定义COLS 2
void func(int(**arr)[COLS],int行)
{
int i,j;
*arr=malloc(sizeof(int[COLS])*行);
printf(“插入编号:\n”);
对于(i=0;i
谢谢!当我执行此操作时,会出现以下错误:错误:从“void*”到“double(*)[1]”的转换无效我的代码是:double(*arr)[NCOLS];struct->arr=malloc(sizeof(double[NCOLS])*nrows)“USER 30827:你是编译成C代码还是C++?如果C是不需要的,如上面所说的,如果你把它编译成C++,那么你需要把结果投进去。在这种情况下,你会把它投到<代码>(double(*)[nCOLs])< /C>。谢谢!当我尝试运行这个程序时,我得到了错误:错误:无效的从“空虚*”转换到int(*)[2] “我该如何纠正这一点?