【问题标题】:error: invalid operands to binary * Pointer to a pointer to a matrix错误:二进制的无效操作数 * 指向矩阵指针的指针
【发布时间】:2014-09-30 04:23:12
【问题描述】:

我收到错误:第 13、20、25、31 和 36 行的二进制 * 操作数无效。我不确定如何处理指向矩阵指针的动态内存分配。此外,如何使用指向指针的指针以类似矩阵的方式存储整数。另外,我意识到就指针而言有很多更简单的方法可以解决这个问题,但我不必使用任何括号,并且函数输入已提供给我。

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);
    printf("\n m: %d\n n: %d\n p: %d\n\n", *m, *n, *p);

    /* allocate memory for A and set values to null */
    A = 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 = 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 = calloc(m * p, sizeof(int));

    /* close FP & free allocated memory */
    fclose(fp);
}

【问题讨论】:

    标签: c pointers matrix scanf calloc


    【解决方案1】:

    有点难以理解你在那个函数中做了什么,但似乎你只需要更好地理解 C 中的指针。

    对于这一行:

    A = calloc(m * n, sizeof(int));
    

    这是在尝试将两个指针相乘,但我假设您想将它们指向的值相乘,因此您需要在 m 和 n 前加上 *取消引用它们(并获得它们的值)。

    对于 A 的赋值,你现在要做的是将一个指针赋值给一个“指向指针的指针”,这是不可能的。您需要通过在 A 前面加上 * 来获得它所指向的指针来尊重 A,然后您还应该将 calloc 的结果转换为 (int*) 以匹配您分配的内容。

    例子:

    *A = (int*)calloc(*m * *n, sizeof(int));
    

    同样的规则适用于代码中的其他错误。

    【讨论】:

    • 谢谢,我不明白当我想使用它们的值时我必须取消引用 m、n 和 p。另外,添加指向 A 的指针会取消引用它允许转换为原始指针或原始值?
    • 当您取消引用 A 时,您将获得底层整数指针。这段代码有点邋遢,但如果你通过 read_matrices( &A, .... ) 调用这个函数(并且 A 是一个 int 指针 [int*]),那么函数内部的 *A 将修改 A 的值(即是函数外部的指针),有效地将外部 A 设置为您在函数中分配的矩阵。
    • 最好还是这样做,以明确期望的结果是什么,并且如果您将代码粘贴到 c++ 文件中,也可以避免错误。
    【解决方案2】:

    让我们看看您的第一个错误。所涉及的变量被声明为int *m, int *n,因此是指向整数的指针。

    第 13 行:

    A = calloc(m * n, sizeof(int));
    

    错误是由m * n 引起的。您是说将指针 m 与指针 n 相乘。这是没有意义的。您可能的意思是将 指向 的值乘以这些指针:(*m) * (*n)。

    老实说,我不明白你为什么首先提出 m 和 n 指针。

    另外,A 被声明为指向指针的指针。这可能意味着您还想要*A。

    我建议您阅读按值传递与按地址传递。

    【讨论】:

    • m 和 n 是指针,用于将它们的值返回给主函数,因为该函数从外部文件中读取它们的值。感谢您的建议,当它超过一个指针以及何时取消引用时,我迷失了方向
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多