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