C 使用经典矩阵代替动态分配时的分割错误

C 使用经典矩阵代替动态分配时的分割错误,c,matrix,C,Matrix,据我所知,创建矩阵的两种方法应该是相同的: 第一种方式: int i; int **matrix = (int**)malloc(R*sizeof(int*)); for (i=0; i<R; i++) matrix[i] = (int*)malloc(C*sizeof(int)); R和C声明为: #define R 3 #define C 5 我的问题是,当我将第二条路声明矩阵传递给这样的函数时: void myfunction(int **m, int rows, int

据我所知,创建矩阵的两种方法应该是相同的:

第一种方式:

int i;
int **matrix = (int**)malloc(R*sizeof(int*));
for (i=0; i<R; i++)
    matrix[i] = (int*)malloc(C*sizeof(int));
R和C声明为:

#define R 3
#define C 5
我的问题是,当我将第二条路声明矩阵传递给这样的函数时:

void myfunction(int **m, int rows, int columns);
void myfunction(int m[][C], int rows, int columns);
使用代码:

myfunction(matrix,R,C);
为什么当我试图触摸矩阵中的值时,它会给我一个分段错误

当我将第一条路声明的矩阵传递给如下函数时,也会发生同样的情况:

void myfunction(int **m, int rows, int columns);
void myfunction(int m[][C], int rows, int columns);

我遗漏了什么?

您正在访问超出范围的内存这里:

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

for(i=0;i第一种方法将指针数组分配给已分配的int数组。
第二种方法分配单个数组,并使用C参数计算正确的偏移量

它们不能互换


有关差异,请参阅。

您正在访问超出边界的数组。然后,结果未定义。应按如下方式更正此行

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

用于(i=0;isorry,这只是分散注意力,不是问题的重点。谢谢你的回答。对不起,这只是分散注意力,不是问题的重点。谢谢你的回答。谢谢你,那一页很好地解释了这个问题,我想我现在终于明白了。好吧,不。我想我明白了,但我没有。为什么它起作用当我在main内部交换这两种方式时,但当我以“错误”的方式将同一指针传递给函数时,它停止工作?这是可行的:这也是可行的:但是在函数内部执行相同的操作(使用上面交换的原型)是不可行的。如果您声明
int a[R][C]
,您正在创建一个大的内存块。
a
指向开头,当您使用
a[x][y]
访问它时,编译器使用声明跳到正确的点,如果您将它传递给一个需要
int**
的函数并写入
**a
,函数本质上是这样说的“a
指向什么?”它找到第一个数组元素,然后说“好的,现在该位置指向什么?”。然后它会像指针一样处理数据,然后得到错误。