在C中分配一个二维数组,其中一维固定

时间:2012-11-08 18:24:35

标签: c arrays 2d malloc

我想动态分配2D数组的1维(给出另一个维度)。这有用吗:

int NCOLS = 20;

// nrows = user input...

double *arr[NCOLS];

arr = (double *)malloc(sizeof(double)*nrows);

并释放它:

free(arr)

3 个答案:

答案 0 :(得分:6)

不完全 - 你声明的是一个指针数组。你想要一个指向数组的指针,它将被声明为:

double (*arr)[NCOLS];

然后,你会像这样分配它:

arr = malloc(nrows * sizeof(double[NCOLS]));

然后可以将其视为nrowsNCOLS二维数组的正常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);

做同样的事情以免费。