传递“普通”2d数组以用作**

时间:2012-08-09 07:36:34

标签: c arrays dynamic-allocation

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

5 个答案:

答案 0 :(得分:2)

要将2D数组传递给函数,您需要在编译时至少知道第二维中的元素数。

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);

答案 1 :(得分:1)

func()的声明更改为:

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

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

答案 2 :(得分:1)

2d数组不等同于**。通常,您可以剥离一个间接“层”,而不是用[]替换它。因此float *A[]之类的内容相当于float **A。请注意,您也可以只有一个具有未定义大小的数组维度;因此float[2][]没问题,而float[][]则没有。

您需要将您的功能更改为void func(float *arr[2], ...)void func(float arr[2][], ...)

答案 3 :(得分: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);
}

答案 4 :(得分: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)