我想调用带有一些参数的函数,并在此函数中分配一个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
}
答案 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);