C语言 尝试将 2 个矩阵相乘时出现 Segfault 11

  • 本文关键字:Segfault 语言 c malloc
  • 更新时间 :
  • 英文 :


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

  1. 当我尝试像 [2]、[3] 和 [3]、[2] 这样大小不等的数组时,我得到了一个分段错误 11,在盯着我的分配后,我仍然无法弄清楚为什么。

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

-

#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("%dt", 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("%dt", 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("%dt", c[i][j]);
        }
    }
    printf("n");
    return 0;
}

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

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;
     }   

然后你覆盖b的边界(它是m2_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的成功。

你的代码中有很多错误:

第一

//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]);
    }
}

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

第三

//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;
        }

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

相关内容

  • 没有找到相关文章