C 取消引用结构内的数据**结构内*

C 取消引用结构内的数据**结构内*,c,pointers,struct,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]; }; 我试图在我的世界结构中更改房间结构对象的值 我已经初始化了一个str

这是我的结构代码:

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];
};
我试图在我的世界结构中更改房间结构对象的值

我已经初始化了一个
struct world*world=worlds


要更改其中一个struct room*中的值,解引用代码是什么样子的?

假设
struct world*worlds=&someObject
,如果
worlds->rooms
是指向rooms的指针数组,您可以按照@Alan Au的注释执行

 struct room * r_array[] = {&room1, &room2, &room3};
 worlds->rooms = r_array;
 printf("%s\n", worlds->rooms[index]->name);
如果
worlds->rooms
是一个指向单个房间指针的指针,则可以打印如下名称:

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

假设
struct world*worlds=&someObject
,如果
worlds->rooms
是指向rooms的指针数组,您可以按照@Alan Au的注释执行

 struct room * r_array[] = {&room1, &room2, &room3};
 worlds->rooms = r_array;
 printf("%s\n", worlds->rooms[index]->name);
如果
worlds->rooms
是一个指向单个房间指针的指针,则可以打印如下名称:

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

假设
struct world*worlds=&someObject
,如果
worlds->rooms
是指向rooms的指针数组,您可以按照@Alan Au的注释执行

 struct room * r_array[] = {&room1, &room2, &room3};
 worlds->rooms = r_array;
 printf("%s\n", worlds->rooms[index]->name);
如果
worlds->rooms
是一个指向单个房间指针的指针,则可以打印如下名称:

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

假设
struct world*worlds=&someObject
,如果
worlds->rooms
是指向rooms的指针数组,您可以按照@Alan Au的注释执行

 struct room * r_array[] = {&room1, &room2, &room3};
 worlds->rooms = r_array;
 printf("%s\n", worlds->rooms[index]->name);
如果
worlds->rooms
是一个指向单个房间指针的指针,则可以打印如下名称:

  printf("%s\n", (*worlds->rooms)->name);//or
  printf("%s\n", (*(*worlds).rooms)->name);
初步安排 我已经“修复”(无论如何修改)了您的初始化代码,该代码来自语法错误的:

struct *world = worlds
语法正确(但不一定是您的想法):

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

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

进入房间 鉴于:

int n = 1;  // For instance
你可以写:

printf("Room %d: %s\n", n, world->rooms[n]->name);
假设您已正确初始化结构。

初步修复 我已经“修复”(无论如何修改)了您的初始化代码,该代码来自语法错误的:

struct *world = worlds
语法正确(但不一定是您的想法):

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

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

进入房间 鉴于:

int n = 1;  // For instance
你可以写:

printf("Room %d: %s\n", n, world->rooms[n]->name);
假设您已正确初始化结构。

初步修复 我已经“修复”(无论如何修改)了您的初始化代码,该代码来自语法错误的:

struct *world = worlds
语法正确(但不一定是您的想法):

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

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

进入房间 鉴于:

int n = 1;  // For instance
你可以写:

printf("Room %d: %s\n", n, world->rooms[n]->name);
假设您已正确初始化结构。

初步修复 我已经“修复”(无论如何修改)了您的初始化代码,该代码来自语法错误的:

struct *world = worlds
语法正确(但不一定是您的想法):

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

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

进入房间 鉴于:

int n = 1;  // For instance
你可以写:

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

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

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->num\u rooms=世界中的房间数量;
世界->房间=malloc(sizeof(*(世界->房间))*世界->房间数);
//修正:检查错误
用于(无符号整数房间i=0;房间inum房间;++房间i){
struct room*room=malloc(sizeof(*room));//修复:检查错误
世界->房间[房间]=房间;
(无效)strcpy(房间->名称,“房间名称”);
//…等等,在房间里
}

您可以使用
world->rooms[room\u index]->field
访问单个文件室的字段,或者最好先指定一个指针
struct room*room=world->rooms[room\u index]
,然后在
struct world*world
指向有效的
struct world
时,通过
room->field
访问该文件室的字段:

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->num\u rooms=世界中的房间数量;
世界->房间=malloc(sizeof(*(世界->房间))*世界->房间数);
//修正:检查错误
用于(无符号整数房间i=0;房间inum房间;++房间i){
struct room*room=malloc(sizeof(*room));//修复:检查错误
世界->房间[房间]=房间;
(无效)strcpy(房间->名称,“房间名称”);
//…等等,在房间里
}

您可以使用
world->rooms[room\u index]->field
访问单个文件室的字段,或者最好先指定一个指针
struct room*room=world->rooms[room\u index]
,然后在
struct world*world
指向有效的
struct world
时,通过
room->field
访问该文件室的字段:

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->num\u房间=数量_