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);
我想用一些参数调用一个函数,并在这个函数中分配一个二维数组,然后将指向它的指针传递回 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);