矩阵乘积c,核心转储错误

matrix product c, core dump error

我尝试创建两个矩阵并在另一个矩阵中进行乘积,但编译器给出了 core dump 错误。前两个矩阵的创建是正确的;第三个矩阵有问题。

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

int main()
{

int m;
int n;
int t;
int i;
int **A;
int **B;
int k;
int j;
scanf("%d",&n);
scanf("%d",&m);
scanf("%d",&t);
A=malloc(n*sizeof(int*));
for(i=0;i<n;i++){
    A[i]=malloc(m*sizeof(int));
            }
            for(i=0;i<n;i++){  // A[n][m]
                for(j=0;j<m;j++)
                    {
                    scanf("%d",&(A[i][j]));
                    }
                }
              B=malloc(t*sizeof(int*));
              for(i=0;i<t;i++) //B[m][t]
                {
                B[i]=malloc(n*sizeof(int));
                }
              for(i=0;i<t;i++){
                for(j=0;j<n;j++)
                    {
                    scanf("%d",&(B[i][j]));
                    }
                            }

                            int **C;


C=malloc(t*sizeof(int*));
for(i=0;i<t;i++){{A[i]=malloc(m*sizeof(int));}


for(i=0;i<t;i++){
    for(j=0;j<m;j++){
    C[i][j]=0;

        for(k=0;k<n;k++)
        {

            (C[i][j])=(C[i][j])+((A[k][j])*(B[i][k]));
        }

    }

}


}


                    return 0;

}

您必须为 C 而不是 A 分离内存。这就是为什么当您尝试访问 C[i][j] 时会生成此错误。变化:

for(i=0;i<t;i++){{A[i]=malloc(m*sizeof(int));}

for(i=0;i<t;i++){ C[i]=malloc(m*sizeof(int));}

完整代码:

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

int main()
{
    int m;
    int n;
    int t;
    int i;
    int **A;
    int **B;
    int k;
    int j;
    scanf("%d",&n);
    scanf("%d",&m);
    scanf("%d",&t);
    A=malloc(n*sizeof(int*));
    for(i=0;i<n;i++){
        A[i]=malloc(m*sizeof(int));
    }

    for(i=0;i<n;i++){  // A[n][m]
        for(j=0;j<m;j++){
            scanf("%d", &(A[i][j]));
        }
    }

    B=malloc(t*sizeof(int*));
    for(i=0;i<t;i++) //B[m][t]
    {
        B[i]=malloc(n*sizeof(int));
    }

    printf("B\n");
    for(i=0;i<t;i++){
        for(j=0;j<n;j++)
        {
            scanf("%d",&(B[i][j]));
        }
    }

    int **C;
    C=malloc(t*sizeof(int*));
    for(i=0;i<t;i++){
        C[i]=malloc(m*sizeof(int));
    }

    for(i=0;i<t;i++){
        for(j=0;j<m;j++){
            C[i][j]=0;
            for(k=0;k<n;k++)
            {

                (C[i][j])=(C[i][j])+((A[k][j])*(B[i][k]));
            }
        }
    }

    return 0;
}

以前的答案可能已经解决了导致崩溃的问题,但代码仍然有问题。如果变量具有更具描述性的名称,那就太好了。由于每个变量都在单独的行中声明,您可以使用 space 来提供有关变量的描述性注释。

通常先引用矩阵的行,然后再引用列。所以,我会偏离你的用法,并说矩阵 Am 行和 n 列。 B 必须有 n 行,看起来您打算 t 保存 B 中的列数。那么乘积 C 将是一个 m X t 矩阵。

当您为 B 分配 space 时,您的代码开始出错。您分配了 tn 元素,而您本应分配 mt 元素(根据您自己的表示法)。在下面的代码中,因为我更改了 mn 的顺序,所以我分配了 nt 元素。

然后,对于乘积矩阵,我分配了 mt 元素,您分配了 tm 元素。您的代码中产品矩阵元素的计算也是错误的。 C[i][j] 元素是 A 的第 i 行和 B 的第 j 列的向量点积。您计算此元素的方式,C[i][j]A 的第 j 列与 B 的第 i 行的点积。

这是经过更正的代码。我包括了一些输入提示,以及一些代码来显示输入的矩阵和生成的产品。

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

int main(void)
{

    int m;                          // rows in A
    int n;                          // cols in A
    int t;                          // cols in B
    int i;
    int **A;                        // points to first row of A
    int **B;                        // points to first row of B
    int **C;                        // points to first row of C
    int k;
    int j;

    printf("Enter number of rows in A: ");
    scanf("%d", &m);
    printf("Enter number of columns in A: ");
    scanf("%d", &n);
    printf("Enter number columns in B: ");
    scanf("%d", &t);

    A = malloc(sizeof(int*) * m);  // A[m][n]
    for(i = 0;i < m; i++){
        A[i] = malloc(sizeof(int) * n);
    }
    for(i = 0; i < m; i++){
        for(j = 0; j < n; j++)
        {
            scanf("%d", &(A[i][j]));
        }
    }

    B = malloc(sizeof(int*) * n);  // B[n][t]
    for(i = 0; i < n; i++)
    {
        B[i] = malloc(sizeof(int) * t);
    }
    for(i = 0; i < n; i++){
        for(j = 0; j < t; j++)
        {
            scanf("%d", &(B[i][j]));
        }
    }

    C = malloc(sizeof(int*) * m);  // C[m][t]
    for(i = 0; i < m; i++){
        C[i] = malloc(sizeof(int) * t);
    }
    for(i = 0; i < m; i++){
        for(j = 0; j < t; j++){
            C[i][j] = 0;
            for(k = 0; k < n; k++)
            {
                C[i][j] = C[i][j] + A[i][k] * B[k][j];
            }
        }
    }

    printf("Matrix A:\n");
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            printf("%-5d", A[i][j]);
        }
        putchar('\n');
    }

    printf("Matrix B:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < t; j++) {
            printf("%-5d", B[i][j]);
        }
        putchar('\n');
    }    

    printf("Matrix product:\n");
    for (i = 0; i < t; i++) {
        for (j = 0; j < m; j++) {
            printf("%-5d", C[i][j]);
        }
        putchar('\n');
    }

    return 0;
}

这是测试的结果运行:

λ> ./a.out 
Enter number of rows in A: 2
Enter number of columns in A: 3
Enter number columns in B: 2
2 3 4
1 3 5
3 4
5 6
7 8
Matrix A:
2    3    4    
1    3    5    
Matrix B:
3    4    
5    6    
7    8    
Matrix product:
49   58   
53   62