这是我的结构代码:
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 *中的值,取消引用代码会是什么样的?
答案 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
。