如何使用指针与矩阵相乘-C

如何使用指针与矩阵相乘-C,c,pointers,matrix,matrix-multiplication,C,Pointers,Matrix,Matrix Multiplication,我得写一个程序,用指针乘以矩阵。 我的程序运行正确,但存在两个问题: 1) 我只能做一个乘法运算——当我想做下一个乘法运算时,就会出现错误 2) 当我输入第一个和第二个矩阵的数据时,我必须再输入一个 char使我的程序工作 为了解决这些问题,我应该在代码中更改什么 #include <stdio.h> #include <stdlib.h> while (z--) { // the number of sets scanf ("%d

我得写一个程序,用指针乘以矩阵。 我的程序运行正确,但存在两个问题:

1) 我只能做一个乘法运算——当我想做下一个乘法运算时,就会出现错误

2) 当我输入第一个和第二个矩阵的数据时,我必须再输入一个 char使我的程序工作

为了解决这些问题,我应该在代码中更改什么

#include <stdio.h>
#include <stdlib.h>

while (z--) {               // the number of sets
    scanf ("%d %d", &n1, &m1);      // first matrix n1 x m1

    int **A = malloc(n1 * sizeof(int*));
    for (i = 0; i < n1; i++) {
        *(A+i) = malloc(m1 * sizeof(int));
    }

    for (i = 0; i < n1; i++) {
        for (j = 0; j < m1; j++) {
            scanf("%d ", (A+i*m1+j));
        }   
    }

    scanf("%d %d", &n2, &m2);       // second matrix n2 x m2

    int **B = malloc(n2 * sizeof(int*));
    for (i = 0; i < n2; i++) {
        *(B+i) = malloc(m2 * sizeof(int));
    }

    for (i = 0; i < n2; i++) {
        for (j = 0; j < m2; j++) {
            scanf("%d ", (B+i*m2+j));
        }
    }

    if (m1 != n2) {
        printf ("ERROR\n");
    } else {
        int **C = malloc(n1 * sizeof(int*));        //matrix with product
        for (i = 0; i < n1; i++) {
            *(C+i) = malloc(m2 * sizeof(int));
        }

        for (i=0; i<n1; i++) {
            for (j=0; j<m2; j++) {
                *(C+i*m2+j) = 0;
            }
        }

        for (k = 0; k < n2; k++) {
            for (i = 0; i < n1; i++) {
                for (j = 0; j < m2; j++) {
                    C1 = 0;
                    A1 = *(A+i*m1+k);
                    B1 = *(B+k*m2+j);
                    C1 = (C1+A1*B1)%1000;
                    temp = *(C+i*m2+j);
                    *(C+i*m2+j) = temp+C1;
                }
            }
        }

        for (i = 0; i < n1; i++) {
            for (j = 0; j < m2; j++) {
                printf("%d ", *(C+i*m2 +j));
            }
            printf("\n");
        }

        for (i = 0; i < n1; i++) {      // free third matrix
            free(*(C+i));
        }
        free(C);
    }

    for (i = 0; i < n1; i++) {          // free first matrix
        free(*(A+i));
    }
    free(A);

    for (i = 0; i < n2; i++) {              // free second matrix
        free(*(B+i));
    }
    free(B);
}
return 0;
#包括
#包括
而(z-){//集合数
scanf(“%d%d”,&n1,&m1);//第一个矩阵n1 x m1
int**A=malloc(n1*sizeof(int*);
对于(i=0;i对于(i=0;i您写入内存的大小超过了分配的大小。这会调用未定义的行为,这是对您观察到的不稳定行为的一个很好的解释

违规代码如下:

    for (k=0; k<n2; k++){
        for (i=0; i<n1; i++) {
            for (j=0; j<m2; j++) {
                C1=0;
                A1=*(A+i*m1+k);
                B1=*(B+k*m2+j);
                C1=(C1+A1*B1)%1000;
                temp=*(C+i*m2+j);
                *(C+i*m2+j)=temp+C1;
            }
        }
    }
不清楚为什么要计算模
1000
。如果你真的是这个意思,你应该使用这个:

  C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % 1000;
如果您不应该使用
[]
语法,请将其替换为指针解引用的等效语法,而不是2D数组寻址。我理解他们试图教您的内容,但图表会比这更有效

  *(*(C+i)+j) = (*(*(C+i)+j) + *(*(A+i)+k) * *(*(B+k)+j)) % 1000;
正如您可能已经注意到的,2D数组和指向数组的指针数组的
[]
语法是相同的,但为指针算术和解引用生成的代码却大不相同

您还需要在其他地方更改索引方法,以下是更正的代码:

while (z--) {                       // the number of sets
    scanf("%d %d", &n1, &m1);       // first matrix n1 x m1

    int **A = malloc(n1 * sizeof(int*));
    for (i = 0; i < n1; i++) {
        *(A+i) = malloc(m1 * sizeof(int));
        for (j = 0; j < m1; j++) {
            scanf("%d ", *(A+i)+j);
        }   
    }

    scanf("%d %d", &n2, &m2);       // second matrix n2 x m2

    int **B = malloc(n2 * sizeof(int*));
    for (i = 0; i < n2; i++) {
        *(B+i) = malloc(m2 * sizeof(int));
        for (j = 0; j < m2; j++) {
            scanf("%d ", *(B+i)+j);
        }
    }

    if (m1 != n2) {
        printf ("ERROR\n");
    } else {
        int **C = malloc(n1 * sizeof(int*));        //matrix with product
        for (i = 0; i < n1; i++) {
            // using calloc so matrix is initialized to 0
            *(C+i) = calloc(m2, sizeof(int));
        }

        for (k = 0; k < n2; k++) {
            for (i = 0; i < n1; i++) {
                for (j = 0; j < m2; j++) {
                    *(*(C+i)+j) = (*(*(C+i)+j) + *(*(A+i)+k) * *(*(B+k)+j)) % 1000;
                }
            }
        }

        for (i = 0; i < n1; i++) {
            for (j = 0; j < m2; j++) {
                printf("%d ", *(*(C+i)+j));
            }
            printf("\n");
        }

        for (i = 0; i < n1; i++) {  // free third matrix
            free(*(C+i));
        }
        free(C);
    }

    for (i = 0; i < n1; i++) {  // free first matrix
        free(*(A+i));
    }
    free(A);

    for (i = 0; i < n2; i++) {  // free second matrix
        free(*(B+i));
    }
    free(B);
}
return 0;
while(z--){//
scanf(“%d%d”,&n1,&m1);//第一个矩阵n1 x m1
int**A=malloc(n1*sizeof(int*);
对于(i=0;i
你能发布丢失的代码吗?我们看不到你如何调用当前片段,尤其是多次调用。首先,你必须通过添加函数定义和所需变量使代码可编译。语法
*(A+i)
比其等价的
A[i]
可读性差得多,原因是我不能使用“[”和“]“-这是问题中的一个要求。而且乘法后矩阵中的数字可能很大,因此我们必须使用%1000@lotheof如果你不能使用某些东西,那么在你的问题中说明。我们不是读心术的人。好的,对不起,这是我的第一个问题。@chqrlie我在你写的时候编辑了我的代码,但我仍然有相同的代码problems@lotheof:你会吗u将修改后的代码发布到粘贴箱?请不要修改发布的代码语义。您仍然存在问题的原因是,您没有在use实施2D数组地址计算的其他地方解决寻址问题。
while (z--) {                       // the number of sets
    scanf("%d %d", &n1, &m1);       // first matrix n1 x m1

    int **A = malloc(n1 * sizeof(int*));
    for (i = 0; i < n1; i++) {
        *(A+i) = malloc(m1 * sizeof(int));
        for (j = 0; j < m1; j++) {
            scanf("%d ", *(A+i)+j);
        }   
    }

    scanf("%d %d", &n2, &m2);       // second matrix n2 x m2

    int **B = malloc(n2 * sizeof(int*));
    for (i = 0; i < n2; i++) {
        *(B+i) = malloc(m2 * sizeof(int));
        for (j = 0; j < m2; j++) {
            scanf("%d ", *(B+i)+j);
        }
    }

    if (m1 != n2) {
        printf ("ERROR\n");
    } else {
        int **C = malloc(n1 * sizeof(int*));        //matrix with product
        for (i = 0; i < n1; i++) {
            // using calloc so matrix is initialized to 0
            *(C+i) = calloc(m2, sizeof(int));
        }

        for (k = 0; k < n2; k++) {
            for (i = 0; i < n1; i++) {
                for (j = 0; j < m2; j++) {
                    *(*(C+i)+j) = (*(*(C+i)+j) + *(*(A+i)+k) * *(*(B+k)+j)) % 1000;
                }
            }
        }

        for (i = 0; i < n1; i++) {
            for (j = 0; j < m2; j++) {
                printf("%d ", *(*(C+i)+j));
            }
            printf("\n");
        }

        for (i = 0; i < n1; i++) {  // free third matrix
            free(*(C+i));
        }
        free(C);
    }

    for (i = 0; i < n1; i++) {  // free first matrix
        free(*(A+i));
    }
    free(A);

    for (i = 0; i < n2; i++) {  // free second matrix
        free(*(B+i));
    }
    free(B);
}
return 0;