0

プログラムを実行すると、3 つの整数 n、m、p と行列の要素を入力できます。n は行、m と p は列です。ただし、最後の要素を入力した直後にセグメンテーションエラーが表示されます。

4
3
2

要素行列 1[0][0] を入力: 3
要素行列 1[0][1] を入力してください: 9
要素行列 1[0][2] を入力: 3

要素行列 1[1][0] を入力: 2
要素行列 1[1][1] を入力: 7
要素行列 1[1][2] を入力: 9

要素行列 1[2][0] を入力: 0
要素行列 1[2][1] を入力: 5
要素行列 1[2][2] を入力: 8

要素行列 1[3][0] を入力: 5
要素行列 1[3][1] を入力: 4
要素行列 1[3][2] を入力: 3

要素行列 2[0][0] を入力: 8
要素行列 2[0][1] を入力してください: 3

要素行列 2[1][0] を入力: 9
要素行列 2[1][1] を入力: 7

要素行列 2[2][0] を入力: 8
要素行列 2[2][1] を入力: 5

セグメンテーション違反
    matrix1 = (int**) malloc(row1 * sizeof(int*));

//read elements of 1st matrix
for (i = 0; i < row1; i++) {
    matrix1[i] = (int*) malloc(col1 * sizeof (int));
    for (j = 0; j < col1; j++) {
      printf("\nEnter element matrix 1[%d][%d]: ", i, j);
        scanf("%d", &matrix1[i][j]);
    }
}

matrix2 = (int**) malloc(row2 * sizeof (int*));

//read elements of 2nd matrix
for (i = 0; i < row2; i++) {
    matrix2[i] = (int*) malloc(col2 * sizeof (int));
    for (j = 0; j < col2; j++) {
      printf("\nEnter element matrix 2[%d][%d]: ", i, j);
        scanf("%d", &matrix2[i][j]);
    }
}
//memory allocation of no. of cols in matrix
mtxProduct = (int**) malloc(row1 * sizeof (int*));

//memory allocation of no. of cols in matrix
for (i = 0; i < col2; i++) {
    mtxProduct[i] = (int*) malloc(col2 * sizeof (int));
}
//multiplication
for (i = 0; i < row1; i++) {
    for (j = 0; j < col2; j++) {
        mtxProduct[i][j] = 0;
        for (e = 0; e < row2; e++) {
            mtxProduct[i][j] +=(matrix1[i][e] * matrix2[e][j]);
        }
    }
}
//print matrix product
for (i = 0; i < row1; i++) {
    for (j = 0; j < col2; j++) {
        printf("%d ", mtxProduct[i][j]);
    }
    printf("\n");
}
return 0;

}

4

1 に答える 1

2
for (i = 0; i < col2; i++) {
   mtxProduct[i] = (int*) malloc(col2 * sizeof (int));
}

for ループの先頭では、col2 ではなく row1 にする必要があります。セグメンテーション違反とは、アクセスしてはならないメモリ内の場所にアクセスしようとすることを意味します。したがって、範囲外の初期化されていないポインターまたは配列要素にアクセスするコード行を探す必要があります。

于 2012-08-31T13:51:34.790 に答える