计算矩阵乘法时的分段错误(核心转储)错误

我试图在C中实现矩阵乘法。如果我使用矩阵大小超过3,我会得到分段错误错误。对于2×2矩阵,这个代码它完美地工作。 我试图找出原因。

这是我的代码。 请看看它,让我知道我在哪里做错了。

#include  #include  #include  /* matrix data structure. rs = row start re = row end cs = column start ce = column end a = pointer to array of pointers */ typedef struct _matrix { int rs; int re; int cs; int ce; int **a ; }matrix; matrix random_matrix(int n) { matrix random; int i, j, k; random.a = (int **)malloc(sizeof(int *) * n); for (k=0; k < n; k++) random.a[k] = (int *)malloc(n * sizeof(int)); random.cs = random.rs = 0; random.ce = random.re = n -1; for(i=0; i < n; i++){ for(j = 0; j < n; j++){ random.a[i][j] = rand()/108108108.0; } } return random; } void display(matrix m) { int i, j; for (i=m.rs ; i<=m.re ; i++) { for (j=m.cs ; j<=m.ce ; j++) { if(j==m.ce) printf("%d", ma[i][j]); else printf("%d, ", ma[i][j]); } printf("\n"); } printf("\n"); return; } matrix multiply(matrix m1, matrix m2) { int n = m1.re - m1.rs; matrix result; result.rs = result.cs = 0; result.re = result.ce = n; result.a = (int **)malloc(sizeof(int *) * n); for (int k=0; k < n; k++) result.a[k] = (int *)malloc(n * sizeof(int)); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { float sum = 0; for (int k = 0; k < n; k++) sum += m1.a[i][k] * m2.a[k][j]; result.a[i][j] = sum; } } return result; } int main(void) { srand(time(NULL)); matrix m1 = random_matrix(3); matrix m2 = random_matrix(3); display(m1); display(m2); printf(" RESULT \n"); display(multiply(m1, m1)); return 0; } 

令人困惑的rsrecsce导致从rscs开始的“ 不自然的1循环并以rece结束是你的原因

 result.re = result.ce = n; 

但应该是

 result.re = result.ce = n - 1; 

永远不要这样做,只需使用两个这样的指针,分别称为rowscolumns ,以及你的循环

 for (int row = 0 ; row < m.rows ; ++row) { for (int column = 0 ; column < m.columns ; ++column) { } } 

并完全避免混淆。

注意 :你的代码中没有free() ,因为每个malloc()都必须有一个free() ,这对你的代码来说不是一个大问题,但是考虑一个像守护进程/服务一样长寿的程序( 取决于你如何打电话给他们,但他们是一样的 ),一个小的内存泄漏将成为一个主要问题。

 void free_matrix(matrix *m) { for (int i = m->rs ; i <= m->re ; ++i) free(m->a[i]); free(m->a); } 

1 从某种意义上讲,不自然的是,有经验的程序员正确地阅读它们并不容易,并且可能导致您现在正在处理的代码中存在错误。