2012-11-08 104 views
3

我想动态分配二维数组的一维(给出了另一维)。这是否工作:在C中分配一维固定的二维数组

int NCOLS = 20; 

// nrows = user input... 

double *arr[NCOLS]; 

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

,并释放它:

free(arr) 
+0

不,这是行不通的。 – djechlin

回答

6

不太 - 你声明的是一个指针数组。你想要一个指向数组的指针,这将是声明如下:

double (*arr)[NCOLS]; 

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

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

然后它可以被当作一个正常的nrows通过NCOLS 2D阵列。要释放它,只需将它传递到free就像任何其他指针一样。

在C中,不需要转换返回值malloc,因为存在从void*到任何指针类型的隐式转换(这在C++中不是这样)。事实上,这样做可以掩盖错误,例如由于存在隐式声明而无法执行#include <stdlib.h>,所以不鼓励。

数据类型double[20]是“的double阵列20,并且类型double (*)[20]是‘指针的double阵列20’。该cdecl(1)程序在能够解密复杂C声明非常有益的(example)。

+0

谢谢!当我这样做时,我得到以下错误:错误:无效转换从'void *'到'double(*)[1]' – user308827

+0

我的代码是:double(* arr)[NCOLS]; struct-> arr = malloc(sizeof(double [NCOLS])* nrows); – user308827

+1

@ user308827:你是将它编译为C代码还是C++?如果是C,那么就不需要像上面所说的那样,如果你将它编译为C++,那么你需要投射结果。在这种情况下,你会将它转换为'(double(*)[NCOLS])'。 –

0

你必须在第一维分配一个新的数组的每个元素(每个元素是一个指针阵列)可以用于该一个循环:。

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

照此到自由

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; 
} 
+0

谢谢!当我尝试运行该程序时,出现错误:错误:从'void *'无效转换为'int(*)[2]'我该如何纠正? – user308827

+0

根据Adam的建议修正。再次感谢! – user308827