此代码应将matrix A
乘以matrix B
并计算出matrix C
。
matA 3x2
,matB 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;
}
答案 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*));