c - 在 C 的另一个结构中初始化和访问嵌套的 struct char 指针

标签 c arrays pointers struct char

我的问题是嵌套结构的初始化,然后添加到该结构。我不知道如何正确访问结构甚至尝试初始化它。我可以用 malloc 初始化第一个 struct char 指针,但是当我尝试以我可以访问它的方式初始化嵌套结构时:

Rooms[i].Connected[i].conncet_room.

出现故障,我通常的错误是:

subscripted value is neither array nor pointer

这行代码是什么:

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"

每个 Room 都有一个名称和一个事件,然后它将有 1-6 个 connection_rooms。

最后,一旦嵌套结构成功初始化。我将如何添加到 .connect_room?

strcpy(Rooms[0].Connected[0].connect_room, "bath_room");

我正在用 gcc 编译

最佳答案

您似乎有固定数量的房间,这些房间是您在运行时初始化的。每个房间似乎也有最大连接数。在那种情况下,您不必 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 arithmeticrooms 数组中创建指向元素 x 的指针。该表达式等效于 &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;

关于c - 在 C 的另一个结构中初始化和访问嵌套的 struct char 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29974422/

相关文章:

javascript - 创建零填充 JavaScript 数组的最有效方法是什么?

c++ - findtheinfo_ds() 中的 WordNet SynSet ptrlist 仅进入一级

c - 我正在丢失内存分配吗?

c - sprintf 函数在 C 中打印选定的数据?

C - 传递 json_t (jansson lib) 作为参数(指针)

c++ - 在循环中创建结构的更好方法

c - 链表问题

c - 初始化结构数组奇怪的行为

javascript - 将元素附加到页面隐藏输入字段

arrays - 生成所有可能的整数数组