C函数中二维数组的动态分配& return指针

C dynamic allocation of a 2D array in a function & return pointer

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

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


}

你能做的是

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() 和 return 数组中分配内存。 否则你需要传递需要在函数内修改的变量的引用,你传递的是未初始化的值并且在 func() 中所做的更改在 main() 中不可见。

您可以按照我展示的方式避免传递引用。

您需要将指针传递给您的 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 int 的子数组似乎很愚蠢。您打算使这些子阵列动态化吗?然后您需要跟踪它们的分配大小。

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

您这里的不是二维数组,而是指针数组。这是两件截然不同的事情。除非你有一个非常具体的理由使用指向数组的指针,否则不要这样做。它容易出错且效率低下。

对于真正的二维数组,这看起来像

int (*array)[n] = malloc(sizeof(int[n][n]));

// use the array as you like

free(array);