0

我想这样做,但它不起作用。有可能这样做还是我必须将 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);
4

5 回答 5

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);
于 2012-08-09T07:49:51.220 回答
1

将声明更改func()为:

void func(float arr[2][2], int x, int y)
{
}

如需进一步阅读,请参阅此答案:How to pass 2D array (matrix) in a function in C?

于 2012-08-09T07:41:34.630 回答
1

如果您关心一般性,则需要使其像这样工作:

 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);
}
于 2012-08-09T07:52:40.010 回答
1

如果你有一个现代的 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)
于 2012-08-09T07:53:32.900 回答
1

二维数组不等于**. 作为一项规则,您可以剥离一个间接“层”,并将其替换为[]. 因此类似的东西float *A[]等价于float **A. 请注意,您也只能有一个未定义大小的数组维度;因此float[2][]可以,而float[][]不是。

您需要将 func 更改为类似void func(float *arr[2], ...)or的东西void func(float arr[2][], ...)

于 2012-08-09T07:43:52.180 回答