我想我可能会误解如何将指针作为参数传递给C函数。在过去,我欺骗并使用了全局变量和大型单个C文件及其中的所有函数。我正在尝试学习如何使用单独的C文件并将它们链接到单个可执行文件中。
Room是一个typedeffed结构。
我已将该函数原型化为一个名为functions.h的保护头文件:
void init_rooms(Room *rooms[], Room *current_room);
/* (pointer to the room struct array, pointer to current room) */
然后我在main.c和functions.c中包含了那个标题。
functions.c中的函数定义是:
void init_rooms(Room *rooms[], Room *current_room){
current_room = rooms[0];
...}
我在main.c中调用这个函数:
Room * current_room; /* pointer to current player location */
Room * rooms = malloc(sizeof(struct room)*NUM_ROOMS); /* allocate memory for rooms */
init_rooms(rooms, current_room);
我收到了这个错误:
main.c|11|error: incompatible pointer types passing 'Room *' (aka 'struct room *') to parameter of type 'Room **' (aka 'struct room **'); take the address with & [-Werror,-Wincompatible-pointer-types]|
现在,我很确定我没有在这里定义指针的任何指针,而且在我看来我的类型都是一样的。为什么编译器说参数是**类型?
我在Linux上使用Clang,如果这有任何区别的话。
编辑:我也试过像编译器建议的那样解除引用指针,但它给了我一个不同的错误。答案 0 :(得分:3)
init_rooms()
不接受Room *
。它需要一个数组(Room *rooms[]
),这基本上等同于
void init_rooms(Room **rooms, Room *current_room);
如果没有看到剩下的代码,很有可能你想要开始这个功能:
void init_rooms(Room *rooms, Room *current_room)
{
current_room = rooms;
但请注意current_room
只会在内部更改此功能。如果您希望其值更改在之外,请执行以下操作:
void init_rooms(Room *rooms, Room **current_room)
{
*current_room = rooms;
并将其命名为:
init_rooms(rooms, ¤t_room);
答案 1 :(得分:0)
问题在于函数参数:Room *rooms[]
在C中,数组只是指针 - 而指针数组只是指向指针的指针......:)
在您的情况下,定义Room *room[]
与Room **room
您可能希望将其更改为Room *rooms