C语言中的矩阵乘法问题
我正在用C制作一个矩阵乘法计算器。当我运行它时,会输出许多数字,结果如下:C语言中的矩阵乘法问题,c,matrix,matrix-multiplication,C,Matrix,Matrix Multiplication,我正在用C制作一个矩阵乘法计算器。当我运行它时,会输出许多数字,结果如下: 57736 segmentation fault 我在哪里写错了?以下是我编写的代码: int Mtx1row, Mtx1col, Mtx2row, Mtx2col, c, d, e; int first[10][10], second[10][10], mult[10][10]; 获取第一个矩阵行和列 printf("First Matrix: # of row and col?\n"); scanf("%
57736 segmentation fault
我在哪里写错了?以下是我编写的代码:
int Mtx1row, Mtx1col, Mtx2row, Mtx2col, c, d, e;
int first[10][10], second[10][10], mult[10][10];
获取第一个矩阵行和列
printf("First Matrix: # of row and col?\n");
scanf("%d%d", &Mtx1row, &Mtx1col);
printf("Second Matrix: # of row and col?\n");
scanf("%d%d", &Mtx2row, &Mtx2col);
获取第二个矩阵行和列
printf("First Matrix: # of row and col?\n");
scanf("%d%d", &Mtx1row, &Mtx1col);
printf("Second Matrix: # of row and col?\n");
scanf("%d%d", &Mtx2row, &Mtx2col);
比较第一个矩阵列与第二个矩阵行
if (Mtx1col != Mtx2row){
printf("Mtx1col != Mtx2row (x _ x)\n");
return 1;
}
获取第一个矩阵的元素
printf("Enter elements of First Matrix: \n");
for (c = 0; c < Mtx1row; c++)
for (d = 0; d < Mtx1col; d++)
{
printf("\tEnter element %d%d: ", c+1, d+1);
scanf("%d", &first[c][d]);
}
printf(“输入第一个矩阵的元素:\n”);
对于(c=0;c
获取第二个矩阵的元素
printf("Enter elements of Second Matrix: \n");
for (c = 0; c < Mtx2row; c++)
for (d = 0; d < Mtx2col; d++)
{
printf("\tEnter element %d%d: ", c+1, d+1);
scanf("%d", &second[c][d]);
}
printf(“输入第二个矩阵的元素:\n”);
对于(c=0;c
将矩阵1和2相乘并存储到矩阵乘积中
for (c=0; c < Mtx2row; c++){
for (d=0; d < Mtx2col; d++){
for (e=0; e < Mtx1col; e++){
mult[c][d] += first[c][d] * second[d][e];
}
}
}
(c=0;c{
对于(d=0;d
至少有一个数组变量mult
,第一个
,第二个
没有为访问提供足够的内存
当Mtx2row
、Mtx2col
和Mtx1col
的值介于0和10之间(包括0和10)时,内存访问应该正常。所以请检查这些变量的值。作为第一步,您可以只printf
这些值,最好是通过编程检查排除越界值。此外,请检查矩阵是否具有矩阵乘法的兼容维度,即Mtx1col
必须等于Mtx2row
编辑:
既然显示的代码包含scanf语句,我可以给出以下建议始终检查scanf的返回代码,确保已解析所有参数。您甚至可以添加一个额外的
%c
,以确保没有额外的输入。在您的情况下,您还必须检查读取的数组索引是否在允许范围内(此处为0-9)。如果仅当
#columns of the first matrix = #rows of the second matrix.
因此,在创建2D阵列之前,您需要检查这一点
if(Mtx1col == Mtx2row){
//proceed creating the matrices
int first[Mtx1row][Mtx1col], second[Mtx2row][Mtx2col];
int mult[Mtx1row][Mtx2col]; // The resulting matrix is Mtx1row * Mtx2col
// You have variable length arrays(VLAs) above.
}
else{
// put the f/b code here
}
注意
根据C11,VLA是可选功能,而不是强制性功能,
因为它们在C99之下。变量长度数组中的变量一词并不意味着您可以 创建阵列后修改其长度。一旦创建,一个 弗拉保持同样的尺寸。变量这个术语的意思是 首次指定数组维度时可以使用变量 创建数组
<> P>以上摘录是从<强> Stephen Prata的C++底漆加上第六版<强> 你没有显示任何分配这些矩阵的代码的任何部分,而不是任何会“吐出”任何代码的代码。调试器说崩溃发生在哪里?你写了更多的代码。您正在假设bug所在的位置。这些数组从何而来?始终检查scanfI的返回值假设您检查用户输入的大小不超过10?您是否使用调试器完成了此操作?如果你这样做了,你就会知道Mtx1row、Mtx1col等的值被使用了。你的答案没有错,但它是如何回答这个问题的?@4386427我这样说是因为问题中提到的方法本身是错误的。好吧。。。但它并没有解决分段错误——无论如何,这并不重要,因为OP拒绝提供所需的信息。玩得开心:-)