1

我想将我使用 malloc 定义的二维数组传递给函数。首先,我使用博客文章中的代码定义数组。

    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 的类型不完整。我该如何传递它?

4

6 回答 6

2

The C standard supports variable-length arrays, so you do not need to allocate, assign, or use extra pointers. Simply specify the dimensions you want, as shown below.

Allocate an array of M rows of N columns like this:

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

Declare a function that is receiving such an array like this:

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

Pass the array to the function like this:

function(M, N, array);
于 2013-06-21T13:30:00.037 回答
2

参数是一个int**

而且你不必强制转换 malloc 的返回,只需检查它是否不是 NULL

但是既然你使用了 malloc,当你不再需要它时不要使用 free

于 2013-06-21T13:13:54.417 回答
2

myArraybounds 不知道,所以你应该更改 void function(int myArray[][]){void function(int **myArray){.

不要对 malloc 进行类型转换

于 2013-06-21T13:21:00.263 回答
0

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

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

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

void functionB(int **myArray) {
    //implementation
}
于 2013-06-21T13:47:18.143 回答
0

您所做Create2DIntArray的不是实际的二维数组。它只是一个指针数组,每个指针都指向内存中的某个位置。并且每块内存都是通过单独的malloc调用单独分配的(顺便说一句,不要忘记free它)。所以基本上没有保证,有位是按顺序分配的,并且与int myArray[][]. 我想,将数据作为二维数组传递的唯一方法是创建一个真正的二维数组并用你的数据重新填充它。

于 2013-06-21T13:18:05.030 回答
0

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

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

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

3)这是我推荐的:使用结构,像这样

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

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

然后你可以让你的“函数”函数简单地将 2d_array 结构作为它的参数(同样,作为指针或不作为指针,取决于你是否要更改 row_size 和 column_size 变量,我看不出有任何用途除非您重新分配实际数组)。然后,您只需访问“函数”内部结构中的 row_size 和 column_size 变量,就可以获得所需的所有信息。

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

于 2013-06-21T14:01:06.657 回答