编译器说当我将其定义为struct *时,参数是struct **类型

时间:2014-11-29 14:05:09

标签: c function pointers struct

我想我可能会误解如何将指针作为参数传递给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,如果这有任何区别的话。

编辑:我也试过像编译器建议的那样解除引用指针,但它给了我一个不同的错误。

2 个答案:

答案 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, &current_room);

答案 1 :(得分:0)

问题在于函数参数:Room *rooms[] 在C中,数组只是指针 - 而指针数组只是指向指针的指针......:)

在您的情况下,定义Room *room[]Room **room

相同

您可能希望将其更改为Room *rooms