如何使用malloc定义二维数组并将其传递给函数

时间:2013-06-21 13:08:57

标签: c arrays multidimensional-array compiler-errors malloc

我想将使用malloc定义的2d数组传递给函数。 首先,我使用blog post中的代码定义数组。

    int** Make2DIntArray(int arraySizeX, int arraySizeY) {  
    int** theArray;  
    theArray = (int**) malloc(arraySizeX*sizeof(int*));  
    for (int i = 0; i < arraySizeX; i++)  
       theArray[i] = (int*) malloc(arraySizeY*sizeof(int));  
       return theArray;  
    }   

int main(){

int** myArray = Make2DIntArray(nx, ny); 

}

然后我可以将它用作myArray [i] [j]。 之后,我想将这个数组传递给一个函数。我试图像这样传递它:

function(myArray); //function call

//function

void function(int myArray[][]){
//function code goes here
}

但这是错误的。问题是数组的大小每次都不同。我还尝试为数组的列定义最大大小并使用它如下:

#define COLUMNMAX 100

function(myArray); //function call

    //function

    void function(int myArray[][COLUMNMAX]){
    //function code goes here
    }

但是我收到了错误:

  

形式参数1的类型不完整。我如何通过它?

6 个答案:

答案 0 :(得分:2)

参数为int**

并且您不必强制转换malloc,只需检查它是否为NULL

但是,因为你使用malloc不再使用免费的

答案 1 :(得分:2)

myArray界限不明,因此您应将void function(int myArray[][]){更改为void function(int **myArray){

不要typecasting of malloc

答案 2 :(得分:2)

C标准支持可变长度数组,因此您无需分配,分配或使用额外的指针。只需指定所需的尺寸,如下所示。

分配M行N列的数组,如下所示:

int (*array)[N] = malloc(M * sizeof *array);

声明一个接收如下数组的函数:

void function(size_t M, size_t N, int array[][N]);

将数组传递给如下函数:

function(M, N, array);

答案 3 :(得分:0)

使用Create2DIntArray执行的操作不是实际的2d数组。它只是一个指针数组,每个都指向内存中的某个位置。并且每个内存都是单独分配的malloc呼叫(BTW,不要忘记它free)。所以基本上没有任何保证,这些位被分配,并与int myArray[][]一样正确地分配。我想,将数据作为二维数组传递的唯一方法是创建一个真正的二维数组并用数据重新填充它。

答案 4 :(得分:0)

要摆脱你的“形式参数1的类型是不完整的”。错误,你应该在使用之前声明你的功能(前向声明):

void functionB(int **myArray);  //forward declaration

void functionA() {
    functionB(blaaaa);         //usage
}

void functionB(int **myArray) {
    //implementation
}

答案 5 :(得分:0)

看起来你需要的是一些关于数组中行和列大小的预订信息。有多种方法可以做到这一点,但这里有四种方法

1)如果您在编译时知道大小,可以使用您尝试过的定义。定义是全局范围的,您可以在文件中的所有函数中访问它们。而不是以某种方式尝试传递定义的值(如COLUMN_SIZE),只需将其用作“函数”函数中的for循环结束条件。但是,如果您在编译时知道大小,那么您可以简单地创建一个固定大小的数组。 Malloc通常用于动态运行时确定的内存分配。

2)只需将nx和ny的值存储在main中,并使其成为“function”需要3个参数:(int [] [] my_array,column_size,row_size)并将指针传递给数组作为nx和ny。这比方法1更可取,因为它允许在运行时指定数组大小,而不是在编译期间指定。

3)这是我建议的:使用像这样的结构

struct 2d_array{ 
    int row_size;
    int column_size;
    int** actual_array;
    }

有了这个,你有几个选择。您可以编辑Make2dIntArray,使其返回2d_array结构或指向2d_array结构的指针(取决于您是否要通过引用传递或传递值来处理结构)。或者你可以拥有它,以便在main中构建结构。我建议让Make2dIntArray返回结构,它会非常干净。

然后你可以让你的“函数”函数简单地将2d_array结构作为它的参数(再次,作为指针或不作为指针,取决于你是否要更改row_size和column_size变量,我看不到任何目的,除非你remalloc actual_array)。然后,您只需访问“function”中结构中的row_size和column_size变量,就可以获得所需的所有信息。

基本上,这背后的整个想法是簿记。跟踪您需要的信息,并在需要时轻松访问。