我的问题是嵌套结构的初始化,然后添加到该结构。我不知道如何正确访问结构甚至尝试初始化它。我可以使用malloc初始化第一个struct char指针,但是当我尝试以这样一种方式初始化嵌套结构时,我可以使用它来访问它:
Rooms[i].Connected[i].conncet_room.
有一个分解,我通常的错误是:
下标值既不是数组也不是指针
这行代码是什么:
Rooms[i].Connected[j].connect_room=(char*)malloc(sizeof(char*));
以下是我使用的代码:
typedef struct Connections
{
char* connect_room;
} Connections;
typedef struct ROOM
{
char* name;
char* event;
int connect_id;
Connections Connected;
} ROOM;
main(){
// creates memory space for 6 rooms.
int sizeOf=6;
ROOM* Rooms = malloc(sizeOf*sizeof *Rooms);
int i,j;
for(i=0;i<sizeOf;i++)
{
Rooms[i].name=(char*)malloc(sizeof(char*));
Rooms[i].event=(char*)malloc(sizeof(char*));
for(j=0;j<sizeOf,j++)
Rooms[i].Connected[j].connect_room=(char*)malloc(sizeof(char*));
}
}
strcpy( Rooms[0].name, "kitchen"); // This works
strcpy( Rooms[0].Connected[0].connect_room, "hallway"); // This doesn't works
strcpy( Rooms[0].Connected[1].connect_room, "deck"); // This doesn't works
基本我希望结构的结构如下:(以下是结构布局的一个例子,而不是代码)
Rooms[0]
name --> "bed_room"
event --> "sleep"
Connected[0]
connection_room --> "bath_room"
...
Connected[5]
connection_room --> "hall_way"
每个房间都有一个名称和一个事件,然后它将有1-6个连接室。
最后,一旦嵌套结构成功初始化。我如何添加到.connect_room?
strcpy(Rooms[0].Connected[0].connect_room, "bath_room");
我正在使用gcc
进行编译答案 0 :(得分:0)
如果您希望每个房间都有1-6个Connections
项,则需要更改ROOM
声明。您可以使用静态或动态分配来完成此操作。
typedef struct ROOM
{
char* name;
char* event;
int connect_id;
Connections Connected[6];
} ROOM;
// Don't need code to dynamically allocate Connected
for (j = 0; j < 6, j++) {
// 256 is max size of connect_room string
Rooms[i].Connected[j].connect_room = malloc(sizeof(char)*256);
}
如果您有以下内容,则无需动态分配connect_room
变量:
typedef struct Connections
{
char connect_room[256];
} Connections;
您也可以使用name
的{{1}}和event
成员进行此操作。
在更习惯动态分配之前,也许你应该坚持使用静态分配。您将不得不考虑释放动态分配的所有内存。
ROOM
答案 1 :(得分:0)
应该是
...
Connections * Connected;
...
答案 2 :(得分:0)
您似乎拥有固定数量的房间,您可以在运行时初始化它们。每个房间似乎也有最多的连接。在这种情况下,您不必malloc
任何东西。定义一个数组,让连接成为该数组的指针。
C不擅长处理和查找字符串。 (好吧,它可以做得很好,但是字符串处理有些麻烦。)所以,不要让Room连接字符串,而是指向其他房间的指针:
typedef struct Room Room;
#define MAX_CONN 6
struct Room {
char *name;
char *event;
Room *conn[MAX_CONN]; // Connected rooms or NULL
};
连接是指向其他房间的最多MAX_CONN
个指针的数组。未使用的广告位为NULL
。 (你甚至可以指示连接,这样六个插槽指的是北,东,南,西,楼上和楼下的出口。)
由于我建议不要使用字符串作为识别手段,我们将使用房间数组条目的序号。裸号有点不直观,所以让我们声明一个枚举值列表:
enum {
Hallway,
Bathroom,
Bedroom,
NRooms
};
这将房间名称声明为常数0,1和2,NRooms
是房间数,3。
现在房间数组声明:
int main()
{
Room rooms[NRooms] = {
[Hallway] = {
.name = "Hallway",
.event = "loiter",
.conn = {
rooms + Bedroom,
rooms + Bathroom
}
},
[Bedroom] = {
.name = "Bedroom",
.event = "sleep",
.conn = {
rooms + Hallway
}
},
[Bathroom] = {
.name = "Bathroom",
.event = "wash",
.conn = {
rooms + Hallway
}
}
};
room_print(&rooms[Hallway]); // or: rooms + Hallway
room_print(&rooms[Bedroom]);
room_print(&rooms[Bathroom]);
return 0;
}
数组已初始化。我在这里使用了designated initialisers,这是一个C99功能,允许您明确指定数组索引和结构成员名称。这里有点矫枉过正,但如果您创建更多房间并为房间结构添加更多东西,它可能会很方便。 (在此示例中,所有内容都按顺序初始化,因此您可以省略设计的初始化程序,只使用传统的位置初始化。)
表示法rooms + x
使用pointer arithmetic创建指向x
数组中元素rooms
的指针。该表达式相当于&rooms[x]
。
未显式初始化的数组元素和结构元素初始化为零或空值。对于指针,即NULL
。
最后,room_print
例程将创建的数据结构付诸实践:
void room_print(const Room *room)
{
int i;
printf("This is the %s where you %s.\n",
room->name, room->event);
i = 0;
while (i < MAX_CONN && room->conn[i]) {
printf("A door leads to the %s.\n",
room->conn[i]->name);
i++;
}
printf("\n");
}
很抱歉有点冗长,因为您只询问了如何访问连接,但我认为该示例显示了如何使用C初始化程序来实现结构的示例布局。
当然,数据仍然可以在运行时更改。没有什么可以阻止你说:
room[Bathroom].name = "Private bathroom";
room[Bathroom].conn[1] = Bedroom;
room[Bedroom].conn[1] = Bathroom;