我不明白为什么应该执行矩阵乘法的这段代码会出错。
输入:2x2个矩阵,两个矩阵中都有元素1,2,3,4
预期输出: 7 10 15 22
此代码给出的输出: 15 22 12 16
int a[10][10], b[10][10], c[10][10], i, j, k, r1, c1, r2, c2;
int (*pa)[10][10] = &a, (*pb)[10][10] = &b, (*pc)[10][10] = &c;
for ( i = 0; i < r1; i++) {
for(j = 0; j < c2; j++) {
*pc[i][j] = 0;
for(k = 0; k < c1; k++) {
*pc[i][j] += *pa[i][k] * *pb[k][j];
}
}
}
我尝试使用此类打印语句进行调试,结果如下:
给定2x2矩阵,它们具有1,2,3,4作为元素时,将产生以下错误:
at 00 of a is 3
at 00 of b is 1
Elements you're multiplying: 3 1
但是预期的输出是这样的:
at 00 of a is 1
at 00 of b is 1
(其余元素似乎相同) 此处未粘贴的其余代码均无错误。使用打印语句对其进行了彻底检查。
答案 0 :(得分:0)
请先参考以下答案:
Pointer address in a C multidimensional array
Create a pointer to two-dimensional array
一起回答您的问题。这是您的代码的有效版本(简单版本):
#include<stdio.h>
void main()
{
int a[2][2]={{1,2},{3,4}};
int b[2][2]={{1,2},{3,4}};
int c[2][2], i, j, k, r1=2, c1=2, r2=2, c2=2;
int (*pa)[2] = a, (*pb)[2] = b, (*pc)[2] = c;
for ( i = 0; i < r1; i++)
{
for(j = 0; j < c2; j++)
{
pc[i][j] = 0;
for(k = 0; k < c1; k++)
{
pc[i][j] += pa[i][k] * pb[k][j];
}
}
}
for(i=0;i<2;i++)
{
printf("\n");
for(j=0;j<2;j++)
{
printf("%d\t",c[i][j]);
}
}
}