簡體   English   中英

矩陣乘法時的分段錯誤,c

[英]Segmentation fault while matrix multiplication, c

嘗試運行此代碼時遇到分段錯誤問題:

#include<stdio.h>
#include<stdlib.h>


int mallocMatrix (int ***matrix, int A, int B) {
    int i;
    *matrix=(int**)malloc(sizeof(int*)*B);
        for(i=0;i<A;i++)
            (*matrix)[i]=(int*)malloc(sizeof(int)*A);
};

void fillMatrix (int ***matrix, int A, int B) {
    int i, j;
    for(i=0;i<B;i++)
    {
        for(j=0;j<A;j++)
            {
                 printf("Matrix[%d][%d]: ",i+1,j+1);
                 scanf("%d", &(*matrix)[i][j]);
            }
        }
};

void displayMatrix (int ***matrix, int A, int B) {
    int i, j;
    printf ("\n");
    for(i=0;i<B;i++)
    {
        for(j=0;j<A;j++)
        {
            printf ("%d ", (*matrix)[i][j]);
        }
    printf ("\n");
    }
};

int main(){
    int **matrix;
    int **matrix_two;
    int **matrix_three;
    int a, b, c, d;

    printf ("[1st matrix] number of columns:");
    scanf ("%d", &a);
    printf ("[1st matrix] number of rows:");
    scanf ("%d", &b);

        mallocMatrix (&matrix, a, b);
        fillMatrix (&matrix, a, b);

    printf ("[2nd matrix] number of columns:");
    scanf ("%d", &c);
    printf ("[2nd matrix] number of rows:");
    scanf ("%d", &d);

        if (a==d)
        {
            mallocMatrix (&matrix_two, c, d);
            fillMatrix (&matrix_two, c, d);
        }
        else
        {
            printf ("The number of columns of the 1st. matrix must be equal to the number of rows of the 2nd. matrix");
            return -1;
        }

    displayMatrix (&matrix, a, b);
    displayMatrix (&matrix_two, c, d);

    mallocMatrix (&matrix_three, b, c);

    /* multiplication */

    int i, j, k;
    for(i = 0; i < b; i++)
    {
        for(j = 0; j < c; j++)
        {
            for(k = 0; k < b; k++)
            {
                matrix_three[i][j] = matrix_three[i][j] + matrix[i][k] * matrix_two[k][j];
            }
        }
    }

    /* end of multiplication */

    displayMatrix (&matrix_three, b, c);
}

代碼簽名/ 乘法 /后彈出問題。 例如:-第一個矩陣是2x2,-第二個矩陣是3x2。 我期望結果為3x2矩陣,但是當嘗試到達第三列時,BUT代碼給了我2x2矩陣和分段錯誤。 請指出錯誤

我想我在mallocMatrix中發現了您的錯誤:

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

循環條件是錯誤的,您說B是行數,因此對於每行,您都必須分配一個A元素數組,因此循環應為:

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

因此,當您嘗試3x2時,第三行永遠不會初始化,因為您的循環只會迭代2次,並且當您嘗試填充最后一行時會崩潰

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM