乘法矩阵弄错了,不知道为什么,在C中?

时间:2018-11-06 19:55:29

标签: c

此代码应将matrix A乘以matrix B并计算出matrix CmatA 3x2matB 2x3,因此matC应该是3x3。 但是,当我打印matC时,第三行包含垃圾值。 我不知道错误在哪里-如果我对指针做错了事,或者计算部分错了。

这是我在打印时看到的。

x x 2489458943
x x 2489587641
x x 2489745734

或者类似的东西。 我不知道为什么有时会起作用。 我的意思是它会打印正确的值,但是大多数情况下这就是我所看到的。

#include <stdio.h>

int main() {
    int x = 0,y = 0, z = 0;
    int i,j,k;
    int **matA;
    int **matB;
    int **matC;
    matA = (int**)malloc(sizeof(int)*3); // making the matrixes by malloc functions
    matB = (int**)malloc(sizeof(int)*2);
    matC = (int**)malloc(sizeof(int)*3);
    for(i = 0; i < 3; i ++)
    {
        matA[i] = (int*)malloc(sizeof(int)*2); // matA 3x2
    }
    for(i = 0; i < 2; i++)
    {
        matB[i] = (int*)malloc(sizeof(int)*3); // matB 2x3
    }
    for(i = 0; i < 3; i++)
    {
        matC[i] = (int*)malloc(sizeof(int)*3); // the calculated mat 3x3
    }
    for(i = 0; i < 3; i++)
    {
        printf("please eneter line number: %i",i+1); //putting the values by scanf function in matA 
        printf(" seperated with ','\n");
        scanf("%d,%d",&x,&y);
        matA[i][0] = x;
        matA[i][1] = y;
    }
    for(i = 0; i < 2; i++)
    {
        printf("please eneter line number: %i",i+1);// putting the values in matB
        printf(" of the second mat seperated with ','");
        scanf("%i,%i,%i", &x, &y, &z);
        matB[i][0] = x;
        matB[i][1] = y;
        matB[i][2] = z;
    }
    for(i = 0; i < 3; i++) // multiple the matrixes by 3 loops
    {
        for(j = 0; j < 3; j++)
        {
            for(k = 0; k < 2; k++)
            {
                matC[j][i] += matA[j][k]*matB[k][i];
            }
        }
    }
    for(i = 0; i < 3; i ++)// just printing to check if the matrix correct
    {
        for(j = 0; j < 3; j++)
        {
            printf("%i ",(int**)matC[i][j]);

        }
        printf("\n");
    }


    return 0;
}

2 个答案:

答案 0 :(得分:1)

您没有在矩阵中分配足够的空间:

matA = (int**)malloc(sizeof(int)*3);
matB = (int**)malloc(sizeof(int)*2);
matC = (int**)malloc(sizeof(int)*3);

您正在为数组int分配空间,但是您需要一个int *数组。指针很可能在系统上大于整数,这意味着您的数组不够大,无法容纳所需的内容,并且无法运行数组的末尾。这样做会调用undefined behavior

int *的数组分配空间。另外,don't cast the return value of malloc

matA = malloc(sizeof(int *)*3);
matB = malloc(sizeof(int *)*2);
matC = malloc(sizeof(int *)*3);

您还将添加matC的元素而不对其进行初始化。您应该先将它们设置为0:

        matC[j][i] = 0;
        for(k = 0; k < 2; k++)
        {
            matC[j][i] += matA[j][k]*matB[k][i];
        }

您在这里也不需要演员表

printf("%i ",(int**)matC[i][j]);

由于每个matC[i][j]的类型均为int,因此您正在打印int。这还会调用未定义的行为,因为表达式的类型与格式说明符的类型不匹配。

答案 1 :(得分:0)

您永远不会初始化matC,然后再使用matC +=

malloc函数分配大小字节,并返回指向分配的内存的指针。内存未初始化。尝试使用calloc

另外,您在错误的int**初始化中,应该分配指针大小sizeof(int*),而不仅仅是sizeof(int)

matA = (int**)calloc(3, sizeof(int*));
matB = (int**)calloc(2, sizeof(int*));
matC = (int**)calloc(3, sizeof(int*));