c-如何使用malloc定义一个2d数组并将其传递给一个函数



我想把我用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变量,就可以获得所需的所有信息。

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

相关内容

  • 没有找到相关文章

最新更新