环顾四周后,我已经构建了一个接受矩阵并执行我需要的任何功能的函数,如下所示:
float energycalc(float J, int **m, int row, int col){
...
}
在main中,定义并填充了数组的大小,但是我不能将它传递给函数本身:
int matrix[row][col];
...
E=energycalc(J, matrix, row, col);
这会在编译期间产生警告
" project.c:149:警告:传递'energycalc'的参数2 不兼容的指针类型project.c:53:注意:期望'int **'但是 参数的类型为'int(*)[(long unsigned int)(col + -0x00000000000000001)]'
并导致分段错误。
非常感谢任何帮助,谢谢。
答案 0 :(得分:3)
如果数组声明为
int matrix[row][col];
然后将函数声明更改为
float energycalc(float J, int m[][col], int row, int col){
T
类型的二维数组的名称不会衰减为T**
。
如果col
是局部变量,则需要在col
之前使用matrix
参数调用该函数。这样做是为了使col
在函数中可见。
答案 1 :(得分:3)
该函数应声明为
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
。
您的功能声明
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 ) );
答案 2 :(得分:2)
将二维数组传递给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);
并将您的功能称为
E = energycalc(col, matrix, row, J);
答案 3 :(得分:0)
我认为你可以在C
中做这样的事情float function_name(int mat_width, int mat_height, float matrix[mat_width][mat_height]) {
... function body...
}
答案 4 :(得分:0)
指向指针的指针不是数组,也不指向二维数组。它与数组没有任何关系,周期,所以忘了你曾经听说过指针到指针和数组。
(混乱可能来自成群混乱的潜在编程教师/作者告诉大家他们应该在分配动态2D数组时使用指针指针。这只是一个简单的错误建议,因为它不会分配一个在相邻的内存单元中分配的实数数组,而是在整个堆中以碎片形式分割的碎片查找表。See this以获取有关如何实际分配此类数组的参考。)
假设您的编译器并不完全古老,只需使用可变长度数组(VLA),这是C语言中引入C99标准的功能。
#include <stdio.h>
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<row; r++)
{
for(size_t c=0; c<col; c++)
{
printf("%d ", matrix[r][c]);
}
printf("\n");
}
}