【问题标题】:Passing struct pointers to functions将结构指针传递给函数
【发布时间】:2020-05-15 13:36:56
【问题描述】:

嘿,我无法理解结构如何作为指针传递给函数,因为我想稍后在我的项目中修改我的结构。所以我正在创建一个有房间的游戏,这个函数创建了一个二维的世界数组。我在 struct room 和 struct World 中传递,因为我将每个房间存储在 World struct 中的绳索中,这是一个 2d 数组。当我打印出每个房间时,它什么都没有打印出来,我认为问题出在我的指针上。

所以我的第一个函数位于结构数组中,它将保存所有房间,并将每个房间初始化为数组。然后我尝试打印出每个房间号,但它没有打印任何东西。

第二个函数创建我的 2d 世界,它将是 3x3 世界。这将一个房间放在世界的绳索上

struct room
{
    int roomNum;
    int creaturesTotal;
    char description[50];
    char cleanOrdirty[20];
};

int main()
{
    int MaxRooms = 8;
    int rows = 2;
    int cols = 2;
    //creaste each room
    struct room Room1;
    struct room Room2;
    struct room Room3;
    struct room Room4;
    struct room Room5;
    struct room Room6;
    struct room Room7;
    struct room Room8;
    struct room Room9;
    struct PC player;
    player.respect = 40;

    //Store them into a array
    struct room AllRooms[MaxRooms];
    AllRooms[0] = Room1;
    AllRooms[1] = Room2;
    AllRooms[2] = Room3;
    AllRooms[3] = Room4;
    AllRooms[4] = Room5;
    AllRooms[5] = Room6;
    AllRooms[6] = Room7;
    AllRooms[7] = Room8;
    AllRooms[8] = Room9;

    struct room World[rows][cols];

    createRooms(AllRooms);

    //create the world
    createWorld(AllRooms,rows,cols,World);

    struct PC cords[rows][cols];
    player = startPointPC(&player,rows,cols,&World,&cords);
}



void createRooms(struct room* AllRooms[])
{
    int MaxRooms = 8;
    int number = 1;
    for(int i = 0;i <= MaxRooms; i++)
    {
        AllRooms[i]->roomNum = number;
        number++;
    }
    for(int i = 0;i <= MaxRooms; i++)
    {
        printf("%d",AllRooms[i]->roomNum);
    }

}

//creates the 2d world
void createWorld(struct room* AllRooms[], int rows, int cols, struct room* World[rows][cols])
{
    int counter = 0;
    for(int i = 0; i <= rows;i++)
    {
        for(int j = 0; j <= cols; j++)
        {
            World[i][j] = AllRooms[counter];
            counter++;
            printf("\nWorld %d", World[i][j]->roomNum);
        }

    }
}

    struct PC startPointPC(struct PC* player,int rows, int cols, struct room* 
    World[rows][cols],struct PC* cords[rows][cols])
    {

       int x = 0;
       int y = 0;

       player->x = x;
       player->y = y;

       //cords[x][y] = player;
       printf("\nYou are starting in Room %d",World[x][y]->roomNum);

       return player;

}

【问题讨论】:

  • 没有比看到你用struct room AllRooms[] 调用createRooms 而不是你声明createRooms 的方式更仔细了,也就是说它是接收@987654325 @.
  • 换一种说法,createRooms() 期待一个指向房间的指针数组,但你发送给它的是一个房间数组。
  • 对不起,我还是有点困惑,我刚开始使用 C,所以指针对我来说是新的,你的意思是让我的数组成为指针?

标签: c multidimensional-array struct structure declaration


【解决方案1】:

此声明

AllRooms[8] = Room9;

访问具有[0, MaxRooms).范围内元素的数组之外的内存

此外,像这样的任务

AllRooms[0] = Room1;

可以调用未定义的行为,因为对象 Room1 没有被初始化并且它的整数数据成员可以有陷阱值。

你创建了一个一维数组

struct room AllRooms[MaxRooms];

并将其作为参数传递给函数createRooms

createRooms(AllRooms);

表达式中的数组指示符(极少数例外)被转换为指向其第一个元素的指针。

所以其实这个调用

createRooms(AllRooms);

等价于

createRooms(&AllRooms[0]);

并且参数的类型为struct room *。

但是,您声明的函数具有 struct room* AllRooms[] 类型的参数,编译器将其调整为 struct room ** 类型。

编译器应该发出一条错误消息,指出没有从一种类型的参数到另一种类型的函数参数的隐式转换。

此外,该函数应在main中使用之前声明。

同样在这样的循环中的函数内

for(int i = 0;i

您使用的索引范围不正确。有效范围为[0, MaxRooms)

所以函数应该至少按以下方式声明和定义

void createRooms( struct room AllRooms[] )
{
   int MaxRooms = 8;
   int number = 1;
   for(int i = 0;i < MaxRooms; i++)
   {
       AllRooms[i].roomNum = number;
       number++;
    }
    for(int i = 0;i < MaxRooms; i++)
    {
       printf("%d",AllRooms[i].roomNum);
    }

 }

使用函数的局部变量MaxRooms也是一个坏主意

   int MaxRooms = 8;

而不是传递指定数组大小的相应参数。

函数 createWorld 也存在类似问题。

应该像这样声明和定义

void createWorld( struct room AllRooms[], int rows, int cols, struct room World[rows][cols])
{
    int counter = 0;
    for(int i = 0; i < rows;i++)
    {
        for(int j = 0; j < cols; j++)
        {
            World[i][j] = AllRooms[counter];
            counter++;
            printf("\nWorld %d", World[i][j].roomNum);
        }

    }
}

【讨论】:

  • 您不必将 -> 更改为点,因为它没有传入指针吗?
  • @NazarTrut 谢谢。由于“复制和粘贴”,这是一个错字。:)
  • 我有一个问题,因为我看到你擅长这个,如果我想通过函数修改结构参数,我必须使用指针吗?
  • @NazarTrut 如果只传递一个结构,则必须使用指针。但是如果你传递一个数组,它会自动转换为一个指针。
  • @NazarTrut 如果要更改函数中的原始对象,则必须通过引用传递它。在 C 中,这意味着通过指向对象的指针。当您传递一个数组时,数组指示符将转换为指向其第一个元素的指针。所以实际上数组的所有元素都是通过引用传递的。如果你传递的是单个对象,那么你必须传递一个指向该对象的指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2019-05-03
  • 1970-01-01
  • 2021-07-17
  • 2017-10-02
相关资源
最近更新 更多