>我正在尝试将 2 个动态分配的数组相乘。我有 2 个问题:
-
当我尝试像 [2]、[3] 和 [3]、[2] 这样大小不等的数组时,我得到了一个分段错误 11,在盯着我的分配后,我仍然无法弄清楚为什么。
-
我的最终数组使用正确的行和列进行格式化,但它显示所有 0。我假设这是因为我没有正确分配内存。
-
#include <stdio.h>
#include <stdlib.h>
int main()
{
int **a, **b, **c; //pointers to arrays
int m1_r,m1_c,m2_r,m2_c; //declaring arrays
int i,j,k;
printf("n");
again://repeat if first matrixes are bad
printf("Enter rows and columns for the first matrix.n");//first matrix
scanf("%d%d" ,&m1_r,&m1_c);
printf("Enter rows and Columns for the second matrix.n");//second matrix
scanf("%d%d",&m2_r,&m2_c);
if(m1_c!=m2_r) {
printf("You tried to break my code. Nice try.");
goto again;
}
//memory for first matrix
a = malloc(m1_r * sizeof(int *));
for(i=0; i < m1_r; i++) {
a[i] = malloc(m1_c * sizeof(int));
}
//memory for second matrix
b = malloc(m2_r * sizeof(int *));
for(i=0; i < m2_r; i++) {
b[i] = malloc(m2_c * sizeof(int));
}
//memory for 3rd matrix
c = malloc(m1_r * sizeof(int *));
for(i=0; i < m2_r; i++) {
c[i] = malloc(m2_c * sizeof(int));
}
//input 1st matrix
printf("Enter the numbers of the first matrix.n");
for (i=0; i<m1_r; i++) {
for (j = 0; j<m1_c; j++) {
scanf("%d", &a[i][j]);
}
}
//input 2nd matrix
printf("Enter the second of the first matrix.n");
for (i=0; i<m1_r; i++) {
for (j = 0; j<m1_c; j++) {
scanf("%d", &b[i][j]);
}
}
printf("n");
printf("1st matrix looks like this:n");
//print 1st matrix
for (i=0; i<m1_r; i++) {
for (j = 0; j<m1_c; j++) {
printf("%dt", a[i][j]);
}
printf("n");
}
//print 2nd matrix
printf("n");
printf("2nd matrix looks like this:n");
//print 2st matrix
for (i=0; i<m2_r; i++) {
for (j = 0; j<m2_c; j++) {
printf("%dt", b[i][j]);
}
printf("n");
}
//initialize result matrix to 0
for(i=0; i<m2_r; i++)
for(j=0; j<m2_c; j++) {
c[i][j]=0;
}
//multipication
for(i=0; i<m1_r; i++)
for(j=0; j<m2_c; j++)
for(k=0; k<m1_c; k++) {
c[i][j]+= a[i][k]*b[k][j];
}
//print result
printf("nThe result of the matrix multiplication is:");
for(i=0; i<m1_r; i++) {
printf("n");
for(k=0; k<m2_c; k++) {
printf("%dt", c[i][j]);
}
}
printf("n");
return 0;
}
您为第三个矩阵分配了错误的内存量:
c = malloc(m1_r * sizeof(int *));
for(i=0; i < m2_r; i++)
循环计数应与 malloc 的指针数相同。
为了避免此类错误,请考虑创建一个函数,该函数在维度中传递并返回指针。
稍后,您将再次使用不同的索引覆盖其边界:
for(i=0;i<m2_r;i++)
for(j=0;j<m2_c;j++)
{
c[i][j]=0;
}
然后你覆盖b
的边界(它是m2_r
和m2_c
(:
for (i=0; i<m1_r; i++) {
for (j = 0; j<m1_c; j++) {
scanf("%d", &b[i][j]);
}
}
为了避免这种错误,你可以对变量使用更好的命名约定;还可以考虑使用一个struct
来保存每个指针及其维度变量。然后,您可以拥有一个将任何矩阵归零的函数,并且只需向它传递指向其中一个矩阵结构的指针。
顺便说一句,如果你使用 calloc
而不是 malloc
那么你根本不需要这个循环(尽管你可能无论如何都想拥有这个函数,以便你可以将矩阵归零(。
此外,您还应该检查scanf
和malloc
的成功。
你的代码中有很多错误:
第一
//memory for 3rd matrix
c = malloc(m1_r * sizeof(int *));
for(i=0; i < m2_r; i++) <----- error: used m2_r instead of m1_r
您分配了m1_r和循环直到m2_r。
第二
//input 2nd matrix
printf("Enter the second of the first matrix.n");
for (i=0; i<m1_r; i++) { <----- error: used m1_r instead of m2_r
for (j = 0; j<m1_c; j++) { <----- error: used m1_c instead of m2_c
scanf("%d", &b[i][j]);
}
}
您正在使用第一个矩阵的行和列。
第三
//initialize result matrix to 0
for(i=0; i<m2_r; i++) <----- error: used m2_r instead of m1_r
for(j=0; j<m2_c; j++) {
c[i][j]=0;
}
您使用了第二个矩阵的行值,而不是第一个矩阵