【问题标题】:C dynamic allocation of a 2D array in a function & return pointerC在函数中动态分配二维数组并返回指针
【发布时间】:2015-06-06 09:32:51
【问题描述】:

我想用一些参数调用一个函数,并在这个函数中分配一个二维数组,然后将指向它的指针传回给 main。这不是我正在使用的实际代码,而是一个简化的“玩具”代码来解释我正在尝试什么。我遇到了段错误,我不太明白为什么。我以前做过这样的事情,我认为这会奏效。知道我在搞砸什么吗?

void func(int val, int ** array);
int main()
{
    int **array;
    int i = 2;

    func(i,array);

    // do some stuff with info from array[i][2]

    free(array);
}

void func(int val, int **array)
{

    // do some calculation here to find the row size for array

    array = malloc(row_size*sizeof(int *));
    for (i = 0; i < row_size; i++)
        array[i] = malloc(2* sizeof(int));

// fill the 2d array with some values


}

【问题讨论】:

  • 附注:根据您的需要,分配一个连续的内存区域会更容易,malloc(sizeof(int) * rows * columns)

标签: c arrays malloc


【解决方案1】:

您需要将一个指针传递给您的int **array; 指针。因此,func 将采用 int ***arrayp 参数。这样修改代码:

void func(int rows, int ***arrayp);
int main()
{
    int **array;
    int rows = 2;

    func(rows, &array);

    // do some stuff with info from array[rows][2]

    free(array);
}

void func(int rows, int ***arrayp)
{
    // do some calculation here to find the row size for array
    *arrayp = malloc(rows * sizeof(int *));
    for (int i = 0; i < rows; i++)
        (*arrayp)[i] = malloc(2 * sizeof(int));  

    // fill the 2d array with some values
}

另一种方法是更改​​ func 原型以使 return 成为它分配的 int **array

分配只有 2 个ints 的子数组似乎很愚蠢。您打算使这些子数组动态化吗?然后,您需要跟踪它们分配的大小。

【讨论】:

  • func中,赋值arrayp时,需要de引用一次。
【解决方案2】:

你能做的是

main()

int **array = func(i);

func() 应该是

int **func(int row_size)
{
    int  **array = malloc(row_size * sizeof(int *));
    for (int i = 0; i < row_size; i++)
        array[i] = malloc(2 * sizeof(int));  

    // fill the 2d array with some values
    return array;
}

func() 内分配内存并返回数组。 否则,您需要传递需要在函数中修改的变量的引用,您传递的是未初始化的值,并且在func() 中所做的更改在main() 中不可见。

您可以通过执行我所展示的操作来避免传递引用。

【讨论】:

    【解决方案3】:

    您不应该对真正的二维数组使用特殊函数。自 1999 年以来,可以让它们具有可变界限。

    这里的不是二维数组,而是指针数组。这是两个非常不同的东西。除非您有非常具体的理由使用指向数组的指针,否则不要这样做。它容易出错且效率较低。

    一个真正的 2D 数组看起来像这样

    int (*array)[n] = malloc(sizeof(int[n][n]));
    
    // use the array as you like
    
    free(array);
    

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 2016-01-12
      • 2021-07-30
      • 1970-01-01
      相关资源
      最近更新 更多