将矩阵传递给函数,C

环顾四周后,我已经构建了一个接受矩阵并执行我需要的任何function的函数,如下所示:

float energycalc(float J, int **m, int row, int col){ ... } 

在main中,定义并填充了数组的大小,但是我不能将它传递给函数本身:

 int matrix[row][col]; ... E=energycalc(J, matrix, row, col); 

这会在编译期间产生警告

“project.c:149:警告:从不兼容的指针类型project.c传递’energycalc’的参数2:53:注意:期望’int **’但参数的类型为’int(*)[(long unsigned int) (col + -0x00000000000000001)]’

并导致分段错误。

非常感谢任何帮助,谢谢。

将二维数组传递给C中的函数通常会让新手感到困惑。
原因是他们假设数组是指针并且不了解数组如何衰减指针。
永远记住,当作为参数传递时, 数组转换为指向其第一个元素的指针
在函数调用中

 E = energycalc(J, matrix, row, col); 

matrix被转换为指向其第一个元素的指针,即matrix[0] 。 这意味着传递matrix相当于传递&matrix[0] 。 请注意, &matrix[0]的类型是int(*)[col] (指向col int数组的指针),因此是matrix 。 这表明函数energycalc的第二个参数必须是int(*)[col] 。 将函数声明更改为

  float energycalc(int col, int (*m)[col], int row, float J); 

并将您的function称为

  E = energycalc(col, matrix, row, J); 

该函数应该声明为

 float energycalc( float J, int row, int col, int ( *m )[col] ); 

如果您的编译器支持可变长度数组。

否则如果在声明中

 int matrix[row][col]; 

col是常量,然后可以通过以下方式声明函数

 float energycalc(float J, int m[][col], int row ); 

只要在函数之前定义了常量col

你的function声明

 float energycalc(float J, int **m, int row, int col); 

当你有一个声明的数组时,它是合适的

 int * matrix[row]; 

并且例如,动态分配数组的每个元素

 for ( int i = 0; i < row; i++ ) matrix[i] = malloc( col * sizeof( int ) ); 

如果数组声明为

 int matrix[row][col]; 

然后将函数声明更改为

 float energycalc(float J, int m[][col], int row, int col){ 

类型T二维数组的名称不会衰减为T**

如果col是局部变量,则需要在matrix之前使用col参数调用该函数。 这样做是为了使col在函数中可见。

我想你可以用C做这样的事情

 float function_name(int mat_width, int mat_height, float matrix[mat_width][mat_height]) { ... function body... } 

指向指针的指针不是数组,也不指向二维数组。 它与数组没有任何关系,周期,所以忘了你曾经听说过指针到指针和数组。

(混乱可能来自成群混乱的潜在编程教师/作者告诉每个人在分配动态2D数组时应该使用指针指针。这只是一个简单的错误建议,因为它不会分配一个真正的数组分配在相邻的存储单元中,而是在整个堆中爆炸成碎片的查找表。 请参阅此参考以获取有关如何实际分配此类数组的参考。)

假设您的编译器并不完全古老,只需使用可变长度数组(VLA),这是C语言中引入的C99标准的一个特性。

 #include  void print_matrix (size_t row, size_t col, int matrix[row][col]); int main (void) { int matrix[2][3] = { {1,2,3}, {4,5,6} }; print_matrix(2, 3, matrix); return 0; } void print_matrix (size_t row, size_t col, int matrix[row][col]) { for(size_t r=0; r