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("%

我正在用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("%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拒绝提供所需的信息。玩得开心:-)