在没有括号的情况下将指针打印到矩阵

时间:2014-09-30 19:54:57

标签: c pointers matrix

我正在接收来自文本文件的输入,如下所示:

3 
2 
4 
1 2 
3 4 
5 6 
7 8 9 10 
11 12 13 14

第一行是存储在m中的矩阵A中的行数,第二行是矩阵A中的列数和存储在n中的矩阵B中的行数,第3行是矩阵中的列数B存储在p。

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

 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));
        }
    }
}

当我打印矩阵时,我输出错误的数字。但是当我尝试在读取功能内部打印时,我得到了正确的结果。我得到了结果:

Matrix A contents:

    8   12
   16   20
   24   28
Matrix B contents:

    7   11   15   19
   23   27   31   35

当我改变fscanf时(fp,&#34;%d&#34;,(A + i * * n + j));到fscanf(fp,&#34;%d&#34;,*(A + i * * n + j));我得到一个总线错误,但我现在的方式我得到警告:int格式,指针arg。

1 个答案:

答案 0 :(得分:1)

元素读取中的写入目标都使用错误的指针值。

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

应该是

fscanf(fp, "%d", (*A + i * *n + j));
// here ----------^

第二个矩阵的类似问题:

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

应该是

fscanf(fp, "%d", (*B + i * *p + j));
// here ----------^

大多数现代编译器会警告你这一点,如果你没有提升编译器警告或获得带有大脑的工具链。例如,clang发出:

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