【问题标题】:Segmentation fault while matrix multiplication, c矩阵乘法时出现分段错误,c
【发布时间】:2012-04-20 15:01:43
【问题描述】:

尝试运行此代码时遇到分段错误问题:

#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 矩阵,但代码在尝试到达第三列时给了我 2x2 矩阵和分段错误。请指出错误

【问题讨论】:

  • 您是使用 B 作为列数还是行数?我的意思是在 mallocMatrix 中我说,嘿! mallocMatrix(matrix,3,2) 是 3x2 矩阵?
  • 您不能将两个维度为 2X2 和 3X2 的矩阵按此顺序相乘。但是,您可以将 3X2 与 2X2 相乘,得到一个尺寸为 3X2 的矩阵。此外,可以将 2X2 和 2X3 矩阵相乘,得到一个尺寸为 2X3 的矩阵。
  • 同意tafa,应该是这个问题

标签: c matrix segmentation-fault malloc


【解决方案1】:

我想我在 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 次,而当您尝试填充最后一行时会崩溃

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2017-02-17
    • 2013-04-05
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多