gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:23 25 4
gpt4 key购买 nike

此代码应将 矩阵 A矩阵 B 相乘并计算 矩阵 CmatA 3x2matB 2x3 因此 matC 应该是 `3x3。但是,当我打印 matC 时,第 3 行包含垃圾值。我不知道错误在哪里 — 如果我对指针做错了什么,或者计算部分可能是错误的。

这是我在打印时看到的。

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

最佳答案

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

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。这也会调用未定义的行为,因为表达式的类型与格式说明符的类型不匹配。

关于c - 乘法矩阵弄错了不知道为什么,在 C 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53179080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com