3

我想动态分配 2D 数组的 1 个维度(给定另一个维度)。这是否有效:

int NCOLS = 20;

// nrows = user input...

double *arr[NCOLS];

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

并释放它:

free(arr)
4

3 回答 3

6

不完全——你声明的是一个指针数组。你想要一个指向数组的指针,它的声明如下:

double (*arr)[NCOLS];

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

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

然后可以将其视为二维数组的法线nrowsNCOLS要释放它,只需将它传递给free任何其他指针。

在 C 中,没有必要强制转换 的返回值malloc,因为void*任何指针类型都有隐式转换(这在 C++ 中不成立)。事实上,#include <stdlib.h>由于隐式声明的存在,这样做可以掩盖错误,例如 failed to ,因此不鼓励这样做。

数据类型double[20]为“数组 20 of ” double,类型double (*)[20]为“指向数组 20 的指针double”。该程序在破译复杂的 C 声明(示例cdecl(1)方面非常有帮助。

于 2012-11-08T18:28:53.287 回答
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;
} 
于 2012-11-08T18:35:29.800 回答
0

您必须为第一个维度上的每个元素(每个元素都是指向数组的指针)分配一个新数组。您可以为此使用循环:

for(i = 0; i < NCOLS; i++)
   arr[i] = (double *)malloc(sizeof(double)*nrows);

做同样的事情来释放。

于 2012-11-08T18:28:53.397 回答