Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中分配一个一维固定的二维数组_C_Arrays_2d_Malloc - Fatal编程技术网

在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 of
double
”,类型
double(*)[20]
是“指向数组20 of
double
”。
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] “我该如何纠正这一点?