取消引用struct *内的struct **内的数据

时间:2015-07-10 00:19:23

标签: c pointers struct

这是我的结构代码:

struct world {
   struct room** rooms;
   int num_rooms;
};

struct room {
   char name[MAX_NAME_LENGTH+1];
   char* desc;
   char objects; // bit mask for OBJ_* flags
   struct room* exits[MAX_EXITS];
};

我正在尝试在我的world结构中更改房间结构的对象的值。

我初始化了struct world *world = worlds;

为了更改其中一个struct room *中的值,取消引用代码会是什么样的?

3 个答案:

答案 0 :(得分:1)

假设struct world * worlds = &someObject,如果worlds->rooms是指向房间的指针数组,则可以按@Alan Au评论,

 struct room * r_array[] = {&room1, &room2, &room3};
 worlds->rooms = r_array;
 printf("%s\n", worlds->rooms[index]->name);

如果worlds->rooms是指向单个房间指针的指针,则可以使用printf名称,

  printf("%s\n", (*worlds->rooms)->name);//or
  printf("%s\n", (*(*worlds).rooms)->name);

答案 1 :(得分:1)

初步修正

我已经修复了' (无论如何修改)你的语法不正确的初始化代码:

struct *world = worlds

语法正确(但不一定是你想到的):

struct world *world = worlds;

这意味着在其他地方你也有以下声明和代码来初始化指针:

struct world *worlds;

请注意struct world *world = worlds;是合法的,因为struct world是类型名称(第一个world是结构标记),第二个world是普通的标识符标识符命名空间,而不是结构标记命名空间。

进入房间

假设:

int n = 1;  // For instance

你可以写:

printf("Room %d: %s\n", n, world->rooms[n]->name);

假设您已正确初始化结构。

答案 2 :(得分:1)

struct world *world指向有效的struct world

world->num_rooms = NUMBER_OF_ROOMS_IN_WORLD;
world->rooms = malloc(sizeof(*(world->rooms)) * world->num_rooms);
// FIXME: check error
for (unsigned int room_i = 0; room_i < world->num_rooms; ++room_i) {
    struct room *room = malloc(sizeof(*room)); // FIXME: check error
    world->rooms[room_i] = room;
    (void) strcpy(room->name, "room name");
    // ... etc, init the room
}

您可以使用world->rooms[room_index]->field访问单个会议室的字段,或者最好首先指定指针struct room *room = world->rooms[room_index]然后通过room->field