C在功能和动态中动态分配2D阵列。返回指针

时间:2015-06-06 09:32:51

标签: c arrays malloc

我想调用带有一些参数的函数,并在此函数中分配一个2D数组,然后将指针传递回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


}

3 个答案:

答案 0 :(得分:3)

您需要将指针传递给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 s的子阵列似乎很愚蠢。你打算让这些子阵列动态吗?然后,您需要跟踪其分配的大小。

答案 1 :(得分: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()中不可见。< / p>

您可以通过执行我所显示的内容来避免传递引用。

答案 2 :(得分:0)

您不应该为真正的2D阵列使用特殊功能。自1999年以来,它们可以使用变量边界。

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

对于真正的2D数组,这看起来像

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

// use the array as you like

free(array);