我想把我用malloc定义的2d数组传递给一个函数。首先,我使用博客文章中的代码定义数组。
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的类型不完整。我如何传递它?
参数是int**
并且您不必强制转换malloc的返回,只需检查它是否不是NULL 即可
但既然你使用malloc,当你不再需要它时就不要使用免费
myArray
的边界是未知的,因此应该将void function(int myArray[][]){
更改为void function(int **myArray){
。
不要对malloc 进行类型转换
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);
使用Create2DIntArray
所做的不是实际的2d数组。它只是一个指针数组,每个指针指向内存中的某个位置。每一块内存都通过单独的malloc
调用(BTW,别忘了free
)单独分配。因此,基本上不能保证比特会像int myArray[][]
一样依次分配并正确对齐。我想,将数据作为2d数组传递的唯一方法是创建一个真正的2d数组,并用数据填充它。
要消除"形式参数1的类型不完整"错误,您应该在使用函数之前声明它(正向声明):
void functionB(int **myArray); //forward declaration
void functionA() {
functionB(blaaaa); //usage
}
void functionB(int **myArray) {
//implementation
}
这里似乎需要一些关于数组中行和列大小的预订信息。有多种方法可以做到这一点,但这里有四种
1) 如果你在编译时知道大小,你可以像尝试的那样使用define。define是全局范围的,你可以在文件中的所有函数中访问它们。与其尝试以某种方式传递定义的值(如COLUMN_SIZE),只需将其用作"函数"函数内的for循环结束条件即可。但是,如果您在编译时就知道大小,那么您还可以简单地制作一个固定大小的数组。Malloc通常用于动态运行时确定的内存分配。
2) 只需将nx和ny的值存储在main中,使"function"接受3个参数:(int[][]my_array,column_size,row_size),并将指向数组以及nx和y的指针传递给它。这比方法1更好,因为它允许在运行时而不是编译时指定数组大小。
3) 这是我建议的:使用一个结构,比如这个
struct 2d_array{
int row_size;
int column_size;
int** actual_array;
}
有了这个,你有几个选择。您可以编辑Make2dIntArray,使其返回2d_array结构或指向2d_arrays结构的指针(具体取决于您是要使用按引用传递还是按值传递来处理结构)。或者你可以拥有它,这样你就可以构建主体结构。我建议让Make2dIntArray返回结构,它会非常干净。
然后,你可以让你的"function"函数简单地将2d_array结构作为它的参数(同样,作为指针还是不作为指针,取决于你是否想更改row_size和column_size变量,除非你重新标记actual_array,否则我看不出有任何用途)。然后,您只需访问"function"内部结构中的row_size和column_size变量,就可以获得所需的所有信息。
基本上,这背后的整个想法就是记账。跟踪您需要的信息,并在需要时轻松访问。