在C中分配一个固定一个维度的2D阵列



我想动态分配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]));

然后可以通过NCOLS 2D数组将其视为普通nrows。要释放它,只需像其他任何指针一样将其传递给free

在C中,无需施放malloc的返回值,因为存在从void*到任何指针类型的隐式铸件(在C 中这是不正确的)。实际上,由于存在隐式声明,因此这样做可以掩盖错误,例如未能#include <stdlib.h>,因此会灰心。

数据类型double[20]是" double的数组20,double (*)[20]类型为"指向double的数组20"。cdecl(1)程序对能够破译复杂C声明(示例)非常有帮助。

一个示例:

#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("%dn", (*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);

做同样的事情。

相关内容

  • 没有找到相关文章

最新更新