【问题标题】:Compiler says a parameter is type struct ** when I defined it as struct *当我将参数定义为 struct * 时,编译器说参数是 struct ** 类型
【发布时间】:2014-11-29 14:05:09
【问题描述】:

我想我可能误解了在 C 函数中将指针作为参数传递是如何工作的。过去,我曾作弊并使用了全局变量和包含所有函数的大型单个 C 文件。我正在尝试学习如何使用单独的 C 文件并将它们链接到单个可执行文件中。

Room 是一个类型化结构。

我在一个名为 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]|

现在,我很确定我没有在这里定义任何指向指针的指针,而且在我看来,我的类型都是一样的。为什么编译器说参数是**type?

我在 Linux 上使用 Clang,如果这有什么不同的话。

编辑:我也尝试按照编译器的建议取消引用指针,但它给了我一个不同的错误。

【问题讨论】:

  • clang 错误对我来说真的很清楚。
  • 如果我清楚,我就不会打扰你们了!
  • Room *rooms[] : roomsRoom 的指针数组。 Room * rooms 是指向 Room 的指针。
  • 谢谢 BLUEPIXY,我是个白痴。
  • @Andomonir 抱歉,我不是故意粗鲁的,我的建议是仔细阅读那个错误,并且鉴于 clang 通常有很好的错误消息,这个错误很容易理解,因为你似乎有点理解指针基础知识。

标签: c function pointers struct


【解决方案1】:

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

【讨论】:

  • 感谢您的出色回答。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多