C言語のポインタの課題で任意の行列の積を求めるプログラムを作っているのですが、計算が合っていなかったり、コアダンプになったりしてしまいます。 どこが変か教えていただきたいです。 #include <stdio.h> #include <stdlib.h> int main (void) { int nrow1; // 1つ目の行の数 int ncolm1; // 1つ目の列の数 int nrow2; //2つ目の行の数 int ncolm2; //2つ目の列の数 double **a, **b, **z; // 行列A, B, Z int i, j; printf("1つ目の行の数を入力してください: "); scanf("%d",&nrow1); printf("1つ目の列の数と2つ目の行の数を入力してください: "); scanf("%d",&ncolm1); nrow2=ncolm1; printf("2つ目の列の数を入力してください: "); scanf("%d",&ncolm2); // 行列A // 行の確保:ポインタ配列 a = (double **)malloc(nrow1 * sizeof(double *)); // 列の確保 for (j = 0; j < nrow1; j++) { a[j] = (double *)malloc(ncolm1 * sizeof(double)); } // 行列B // 行の確保:ポインタ配列 b = (double **)malloc(nrow2 * sizeof(double *)); // 列の確保 for (j = 0; j < nrow2; j++) { b[j] = (double *)malloc(ncolm2 * sizeof(double)); } // 行列Z // 行の確保:ポインタ配列 z = (double **)malloc(nrow1 * sizeof(double *)); // 列の確保 for (j = 0; j < nrow2; j++) { z[j] = (double *)malloc(ncolm2 * sizeof(double)); } // 入力 printf("行列Aを入力してください¥n"); for (j = 0; j < nrow1; j++) { for (i = 0; i < ncolm1; i++) { printf("a[%d][%d] = ", j, i); scanf("%lf", &a[j][i]); } } printf("行列Bを入力してください¥n"); for (j = 0; j < nrow2; j++) { for (i = 0; i < ncolm2; i++) { printf("b[%d][%d] = ", j, i); scanf("%lf", &b[j][i]); } } //行列の積 double x=0.0; for (j = 0; j < nrow1; j++) { for (i = 0; i < ncolm2; i++) { x=0.0; for(int k=0;k<nrow1;k++){ x += a[j][k] * b[k][i] ; } z[j][i]=x; } } // 出力 printf("A × B = ¥n"); for (j = 0; j < nrow1; j++) { for (i = 0; i < ncolm2; i++) { printf("%5.2f ", z[j][i]); } printf("¥n"); } // 領域の解放 for (j = 0; j < ncolm1; j++) { free(a[j]); } free(a); for (j = 0; j < ncolm2; j++) { free(b[j]); } free(b); for (j = 0; j < ncolm2; j++) { free(z[j]); } free(z); return 0; }
C言語関連