【问题标题】:how to define a 2d array using malloc and pass it to a function如何使用 malloc 定义二维数组并将其传递给函数
【发布时间】:2013-06-21 13:08:56
【问题描述】:

我想将我使用 malloc 定义的二维数组传递给函数。 首先,我使用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的类型不完整,如何传递?

【问题讨论】:

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


【解决方案1】:

参数是int**

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

但是既然你使用了 malloc 就不要在你不再需要它的时候使用 free

【讨论】:

    【解决方案2】:

    myArray 边界未知,因此您应该将void function(int myArray[][]){ 更改为void function(int **myArray){

    不要发typecasting of malloc

    【讨论】:

      【解决方案3】:

      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);
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 你是说上面的指针数组没有办法传递?
        • 将指针数组作为int** 传递并没有错。但不像int [][]。这些是完全不同的数据结构。
        • int[][] 是有效的语法,akelenuk。这和传递 **int 是一样的。
        【解决方案5】:

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

        void functionB(int **myArray);  //forward declaration
        
        void functionA() {
            functionB(blaaaa);         //usage
        }
        
        void functionB(int **myArray) {
            //implementation
        }
        

        【讨论】:

          【解决方案6】:

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

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

          2) 只需将 nx 和 ny 的值存储在 main 中,并使其“函数”接受 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.js 中构建结构。我建议让 Make2dIntArray 返回结构,它会非常干净。

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

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

          【讨论】:

          • 这个答案忽略了 C 标准支持可变长度数组的事实,因此您可以在运行时简单地声明维度。函数参数甚至可以是指向可变长度数组的指针,其维度来自先前的参数(而不是,如这个答案所示,具有后面参数中指定的大小)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-11-01
          相关资源
          最近更新 更多