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