【问题标题】:type of bool** is incompatible with type bool*[4] [duplicate]bool** 的类型与 bool*[4] [重复] 类型不兼容
【发布时间】:2021-02-21 18:19:55
【问题描述】:

我正在开发一个寻路库以获得乐趣并更加熟悉 C,但我不知道是什么导致了这个错误或如何修复它。为什么 bool** 和 bool*[4] 的类型不兼容?是否有解决此问题的方法或有更好的方法来解决此问题?

#include <stdbool.h>
#include <stdlib.h>

int * A_Star_SolveUnweighted(bool **graph) {

}

int main() {
    bool graph[5][4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
    
    int *path = A_Star_SolveUnweighted(graph);


    return 0;
}


【问题讨论】:

  • 逐字复制错误信息。您已将 bool (*)[4] 更改为 bool *[4],它们含义完全相反

标签: c pointers


【解决方案1】:

以下是不同的类型,它们之间只有一种关系:

  • bool graph[5][4] 是由 4 个 bool 组成的五个数组组成的数组。在许多用途中,它会自动转换为指向 4 个 bool 的数组的指针。
  • bool (*)[4] 是一个指向 4 个 bool 的数组的指针。就是上面转换的结果。
  • bool *[4] 是一个由 4 个指向 bool 的指针组成的数组。它与bool (*)[4] 无关。
  • bool ** 是一个指向 bool 的指针。它不是数组或指向数组的指针。

该例程被声明为采用bool **。由于自动转换,传递它graph 会产生bool (*)[4] 类型的参数。这些不是兼容的类型,因此编译器会抱怨。参数类型bool (*)[4] 指向有4 个bool 的位置(以及在它之后的4 个bool 的附加子数组)。参数类型bool ** 需要指向有指针的位置。由于 4 boolpointer 是非常不同的东西,因此这些类型不兼容。

要解决此问题,您可以将 A_Star_SolveUnweighted 的声明更改为 int *A_Star_SolveUnweighted(bool (*graph)[4])int *A_Star_SolveUnweighted(size_t Columns, bool (*graph)[Columns])

【讨论】:

    【解决方案2】:

    bool graph[5][4] 是一个数组数组。它实际上由连续 20 个布尔值表示(可能带有一些填充)。它可以衰减bool(*)[4],这是一个指针,指向连续四个布尔值的一定数量的集合。

    另一方面,bool** 是一个指向一个或多个指向一个或多个布尔值的指针。还有一个额外的间接层,因为第一个数组包含 pointers 到第二个,而不是简单地直接包含第二个。在顶层,很容易从T[] 转换为T*,因为这实际上只是获取一个地址,但如果它不是数组的顶层,则需要遍历数组以更改所有成分。这或多或少是您所需要的;一个指针数组。

    bool** graph = calloc(5, sizeof(bool*))
    for (int i = 0; i < 5; i++) {
      graph[i] = calloc(4, sizeof(bool));
      // Initialize graph[i] here ...
    }
    

    那么你需要在最后释放它。

    for (int i = 0; i < 5; i++) {
      free(graph[i]);
    }
    free(graph);
    

    当然,如果您可以控制目标函数的签名,您可以考虑将其更改为采用bool*。然后,您可以使用一维数组并只跟踪“行”和“列”的数量,这将更好地对齐您的内存并避免此类问题。

    【讨论】:

    • bool graph[5][4] 被转换为bool (*)[4],而不是bool *[4]
    • 谢谢!我永远不会完全掌握 C 类型签名上的运算符优先顺序。 :P
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2021-07-29
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    相关资源
    最近更新 更多