我想这样做,但它不起作用。有可能这样做还是我必须将 A 声明为双指针浮点**?请注意,我需要一个适用于各种数组维度的通用函数,因此我无法更改函数参数。
void func(float** arr, int x, int y){
//access to arr[0][0] for e.g. causes SEGFAULT
}
...
float A[2][2]={{1,0},{0,1}};
func(A, 2, 2);
我想这样做,但它不起作用。有可能这样做还是我必须将 A 声明为双指针浮点**?请注意,我需要一个适用于各种数组维度的通用函数,因此我无法更改函数参数。
void func(float** arr, int x, int y){
//access to arr[0][0] for e.g. causes SEGFAULT
}
...
float A[2][2]={{1,0},{0,1}};
func(A, 2, 2);
要将二维数组传递给函数,您需要在编译时至少知道二维中的元素计数。
void func(float arr[][2], int n)
如果您在编译时不知道数组的大小,那么您无能为力,除了:
void func(float *arr, int n, int m)
{
// getting arr[i][j] with arr[i*m + j]
}
float A[2][2]={{1,0},{0,1}};
func(&A[0][0], 2, 2);
将声明更改func()
为:
void func(float arr[2][2], int x, int y)
{
}
如需进一步阅读,请参阅此答案:How to pass 2D array (matrix) in a function in C?
如果您关心一般性,则需要使其像这样工作:
void func(int** arr, int x, int y)
{
}
int main()
{
int rows, cols, i;
int **arr;
arr = (int**)malloc(rows * sizeof(int*));
for (i=0; i<rows; i++)
{
arr[i] = (int*)malloc(cols * sizeof(int));
}
arr[0][0]=1;arr[1][0]=0;arr[0][1]=0;arr[0][1]=1;
func(arr, rows, cols);
for (i=0; i<rows; i++)
{
free(arr[i]);
}
free(arr);
}
如果你有一个现代的 C 编译器,从 C99 开始,你可以简单地做
void func(size_t x, size_t y, float arr[x][y]) {
// something using arr[i][j] naturally
}
唯一的限制是大小必须在参数列表中使用之前出现。
然后,在调用端,您可以使用以下内容来避免将动态矩阵分配为auto
变量:
float (*A)[x0] = malloc(sizeof(float[x0][y0]);
...
func(x0, y0, A);
...
free(A)
二维数组不等于**
. 作为一项规则,您可以剥离一个间接“层”,并将其替换为[]
. 因此类似的东西float *A[]
等价于float **A
. 请注意,您也只能有一个未定义大小的数组维度;因此float[2][]
可以,而float[][]
不是。
您需要将 func 更改为类似void func(float *arr[2], ...)
or的东西void func(float arr[2][], ...)
。