[英]C dynamic allocation of a 2D array in a function & return pointer
我想用一些參數調用一個函數,並在此函數內分配一個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
}
您需要將指針傳遞給您的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
的子數組似乎很愚蠢。 您打算使這些子數組動態化嗎? 然后,您需要跟蹤其分配的大小。
你能做的是
在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()
不可見。
您可以通過執行我所顯示的操作來避免傳遞參考。
您不應對真正的2D數組使用特殊功能。 自1999年以來,可以使它們具有可變范圍。
您在這里擁有的不是2D數組而是指針數組。 這是兩件事。 除非確實有特定的原因使用指針指向數組,否則不要這樣做。 它易於出錯且效率較低。
對於真正的2D數組,它看起來就像
int (*array)[n] = malloc(sizeof(int[n][n]));
// use the array as you like
free(array);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.