Segfault 11试图乘以2个矩阵

时间:2014-09-15 22:40:40

标签: c malloc

我正在尝试将2个动态分配的数组相乘。我有两个问题:

  1. 当我尝试不等大小的数组时,如[2],[3]和[3],[2]我得到了一个分段错误11,在盯着我的分配后,我仍然无法找出原因。

  2. 我的最终数组使用正确的行和列进行格式化,但它显示全0。 我假设这是因为我没有正确分配内存。

  3. -

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int **a, **b, **c; //pointers to arrays
        int m1_r,m1_c,m2_r,m2_c; //declaring arrays
        int i,j,k;
    
        printf("\n");
    again://repeat if first matrixes are bad
        printf("Enter rows and columns for the first matrix.\n");//first matrix
        scanf("%d%d" ,&m1_r,&m1_c);
    
        printf("Enter rows and Columns for the second matrix.\n");//second matrix
        scanf("%d%d",&m2_r,&m2_c);
    
        if(m1_c!=m2_r) {
            printf("You tried to break my code. Nice try.");
            goto again;
        }
    
        //memory for first matrix
        a = malloc(m1_r * sizeof(int *));
        for(i=0; i < m1_r; i++) {
            a[i] = malloc(m1_c * sizeof(int));
        }
    
        //memory for second matrix
        b = malloc(m2_r * sizeof(int *));
        for(i=0; i < m2_r; i++) {
            b[i] = malloc(m2_c * sizeof(int));
        }
    
        //memory for 3rd matrix
        c = malloc(m1_r * sizeof(int *));
        for(i=0; i < m2_r; i++) {
            c[i] = malloc(m2_c * sizeof(int));
        }
    
        //input 1st matrix
        printf("Enter the numbers of the first matrix.\n");
    
        for (i=0; i<m1_r; i++) {
            for (j = 0; j<m1_c; j++) {
                scanf("%d", &a[i][j]);
            }
        }
    
        //input 2nd matrix
        printf("Enter the second of the first matrix.\n");
    
        for (i=0; i<m1_r; i++) {
            for (j = 0; j<m1_c; j++) {
                scanf("%d", &b[i][j]);
            }
        }
    
        printf("\n");
        printf("1st matrix looks like this:\n");
        //print 1st matrix
        for (i=0; i<m1_r; i++) {
            for (j = 0; j<m1_c; j++) {
                printf("%d\t", a[i][j]);
            }
            printf("\n");
        }
    
        //print 2nd matrix
        printf("\n");
        printf("2nd matrix looks like this:\n");
        //print 2st matrix
        for (i=0; i<m2_r; i++) {
            for (j = 0; j<m2_c; j++) {
                printf("%d\t", b[i][j]);
            }
            printf("\n");
        }
    
        //initialize result matrix to 0
        for(i=0; i<m2_r; i++)
            for(j=0; j<m2_c; j++) {
                c[i][j]=0;
            }
    
        //multipication
        for(i=0; i<m1_r; i++)
            for(j=0; j<m2_c; j++)
                for(k=0; k<m1_c; k++) {
                    c[i][j]+= a[i][k]*b[k][j];
                }
    
        //print result
        printf("\nThe result of the matrix multiplication is:");
        for(i=0; i<m1_r; i++) {
            printf("\n");
            for(k=0; k<m2_c; k++) {
                printf("%d\t", c[i][j]);
            }
    
        }
        printf("\n");
    
        return 0;
    }
    

2 个答案:

答案 0 :(得分:2)

您为第三个矩阵分配了错误的内存量:

c = malloc(m1_r * sizeof(int *));
for(i=0; i < m2_r; i++)

循环计数应该与malloc指针的数量相同。

为避免出现这种错误,请考虑制作一个在尺寸中传递的函数,然后返回指针。

稍后,您再次使用不同的索引覆盖其边界:

for(i=0;i<m2_r;i++)
  for(j=0;j<m2_c;j++)
     {
         c[i][j]=0;
     }   

然后你覆盖bm2_rm2_c)的界限:

for (i=0; i<m1_r; i++) {
    for (j = 0; j<m1_c; j++) {
        scanf("%d", &b[i][j]);
    }
}

为了避免这种错误,您可以为变量使用更好的命名约定;并且还考虑使用struct来保存每个指针及其维度变量。然后你可以有一个零任何矩阵的函数,你只需要传递一个指向你的矩阵结构的指针。

顺便说一句,如果你使用calloc而不是malloc,那么根本不需要这个循环(尽管你可能想要使用这个函数,这样你就可以将矩阵归零)。

另外,您应该检查scanfmalloc是否成功。

答案 1 :(得分:1)

你的代码中有很多错误:

第一

//memory for 3rd matrix
c = malloc(m1_r * sizeof(int *));
for(i=0; i < m2_r; i++)  <----- error: used m2_r instead of m1_r

你指定了m1_r并循环到m2_r。

第二

//input 2nd matrix
printf("Enter the second of the first matrix.\n");

for (i=0; i<m1_r; i++) {    <----- error: used m1_r instead of m2_r
    for (j = 0; j<m1_c; j++) {   <----- error: used m1_c instead of m2_c
        scanf("%d", &b[i][j]);
    }
}

您正在使用第1个矩阵的行和列。

第三

//initialize result matrix to 0
    for(i=0; i<m2_r; i++)     <----- error: used m2_r instead of m1_r
        for(j=0; j<m2_c; j++) {
            c[i][j]=0;
        }

您使用了第二个矩阵的行值而不是第一个矩阵