C 打印指向无括号矩阵的指针

C 打印指向无括号矩阵的指针,c,pointers,matrix,C,Pointers,Matrix,我正在从一个文本文件中获取一个输入,该文件如下所示: 3 2 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 第一行是存储在m中的矩阵A中的行数,第二行是存储在n中的矩阵A中的列数和矩阵B中的行数,第三行是存储在p中的矩阵B中的列数 我使用此功能从文本文件中获取信息: void read_matrices(int **A, int **B, int **C, int *m, int *n, int *p, char *file) { FILE *f

我正在从一个文本文件中获取一个输入,该文件如下所示:

3 
2 
4 
1 2 
3 4 
5 6 
7 8 9 10 
11 12 13 14
第一行是存储在m中的矩阵A中的行数,第二行是存储在n中的矩阵A中的列数和矩阵B中的行数,第三行是存储在p中的矩阵B中的列数

我使用此功能从文本文件中获取信息:

 void read_matrices(int **A, int **B, int **C, int *m, int *n, int *p, char *file) {
    FILE *fp = fopen(file, "r");
    if (!fp) {
        fprintf(stderr, "\n Error: file open failed for file '%s'\n\n", file);
        exit(0);
    }

    /* read & output m, n, p */
    fscanf(fp, "%d\n%d\n%d\n", m, n, p);

    /* allocate memory for A and set values to null */
    *A = (int*)calloc(*m * *n, sizeof(int));

    /* read A */
    int i, j;
    for (i = 0; i < *m; i++) {
        fscanf(fp, "\n");
        for (j = 0; j < *n; j++) {
            fscanf(fp, "%d", (A + i * *n + j));
        }
    }

    /* allocate memory for B and set values null */
    *B = (int*)calloc(*n * *p, sizeof(int));

    /* read B */
    for (i = 0; i < *n; i++) {
        fscanf(fp, "\n");
        for (j = 0; j < *p; j++) {
            fscanf(fp, "%d", (B + i * *p + j));
        }
    }

    /* allocate memory for C and set values null */
    *C = (int*)calloc(*m * *p, sizeof(int));

    /* close FP & free allocated memory */
    fclose(fp);
}
void print_matrix(int *mtx, int r, int c) {
    int i, j;
    for (i = 0; i < r; i++) {
        printf("\n");
        for (j = 0; j < c; j++) {
            printf("%5d", (mtx + i * c + j));
        }
    }
}

同样,当我更改fscanf(fp,“%d”,(A+I**n+j));到fscanf(fp,“%d”,*(A+i**n+j));我得到了一个总线错误,但是现在我得到了警告:int格式,指针arg。

在元素读取中写入的两个目标都使用了错误的指针值

fscanf(fp, "%d", (A + i * *n + j));
应该是

fscanf(fp, "%d", (*A + i * *n + j));
// here ----------^
fscanf(fp, "%d", (*B + i * *p + j));
// here ----------^
第二个矩阵也存在类似问题:

fscanf(fp, "%d", (B + i * *p + j));
应该是

fscanf(fp, "%d", (*A + i * *n + j));
// here ----------^
fscanf(fp, "%d", (*B + i * *p + j));
// here ----------^
大多数现代编译器都会警告你这一点,如果你不这样做的话,你要么会弹出编译器警告,要么会得到一个有头脑的工具链。例如,叮当声会发出:

main.c:24:30: Format specifies type 'int *' but the argument has type 'int **'

它也是printf(“%5d”,*(mtx+i*c+j));还有吗?@user3339703是的,这是一个单独的问题,但同样需要解决。我对你用错误的指针计算写作更感兴趣。