首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >初始化和访问C中另一个结构中的嵌套struct指针

初始化和访问C中另一个结构中的嵌套struct指针
EN

Stack Overflow用户
提问于 2015-04-30 09:43:19
回答 3查看 1.1K关注 0票数 1

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Rooms[i].Connected[i].conncet_room.

有一个故障,我通常的错误是:

下标值既不是数组也不是指针。

这一行代码是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Rooms[i].Connected[j].connect_room=(char*)malloc(sizeof(char*));

下面是我使用的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

重要的是,我希望这个结构是这样的:(下面是一个结构布局的例子,而不是代码)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 Rooms[0]
     name --> "bed_room"
     event --> "sleep"
     Connected[0]
         connection_room --> "bath_room"
     ...
     Connected[5]
         connection_room --> "hall_way"

每个房间将有一个名称和一个事件,然后它将有1-6 connection_rooms.

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
strcpy(Rooms[0].Connected[0].connect_room, "bath_room");

我和gcc一起编的

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-30 10:50:14

似乎您有一个固定数量的房间,您在运行时初始化。每个房间似乎也有最多的连接。在这种情况下,您不需要malloc任何东西。定义一个数组,并让连接成为指向该数组的指针。

C不擅长处理和查找字符串。(好的,它可以做得很好,但是字符串处理有点麻烦。)因此,让我们不要让Room连接字符串,而是指向其他房间的指针:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。(你甚至可以直接连接,因此这六个插槽指的是北、东、南、西、楼上和楼下的出口。)

由于我建议不要使用字符串作为标识手段,所以我们将使用房间数组条目的序号。裸露的数字有点不直观,所以让我们声明一个枚举值列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
enum {
    Hallway,
    Bathroom,
    Bedroom,
    NRooms
};

这将房间名称声明为常量0、1和2,而NRooms是房间数3。

现在,房间数组声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
}

数组被初始化。我在这里使用了指定首字母,这是一个C99特性,允许您显式地指定数组索引和结构成员名。这里有点过分,但如果您创建更多的空间并为您的房间结构添加更多的东西,它可能会很方便。(在本例中,一切都是按顺序初始化的,因此可以省略所需的初始化符,而只使用传统的位置初始化。)

表示法rooms + x使用指针算法rooms数组中创建指向元素x的指针。表达式等效于&rooms[x]

未显式初始化的数组元素和结构元素被初始化为零或空值。对于指针,这是NULL

最后,将创建的数据结构付诸实践的room_print例程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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初始化符来处理类似于您的结构示例布局的内容。

当然,数据在运行时仍然可以更改。没有什么能阻止你说:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
room[Bathroom].name = "Private bathroom";
room[Bathroom].conn[1] = Bedroom;
room[Bedroom].conn[1] = Bathroom;
票数 0
EN

Stack Overflow用户

发布于 2015-04-30 10:06:56

如果您希望每个房间都有1-6个Connections项目,您需要更改您的ROOM声明。您可以通过静态或动态分配来实现这一点。

静态分配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef struct Connections 
{
    char connect_room[256]; 
} Connections;

您也可以使用nameeventROOM成员来完成这一任务。

也许您应该坚持静态分配,然后才能更好地适应动态分配。您必须考虑释放所有动态分配的内存。

动态分配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef struct ROOM
{
    char* name;
    char* event;
    int connect_id;
    Connections* Connected;
} ROOM;

// To dynamically allocate Connected for each room:
Rooms[i].Connected = malloc(sizeof(Connections)*6);
for (j = 0; j < 6, j++) {
    // 256 is max size of connect_room string
    Rooms[i].Connected[j].connect_room = malloc(sizeof(char)*256);
}
票数 0
EN

Stack Overflow用户

发布于 2015-04-30 10:35:04

它应该是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
Connections * Connected;
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29974422

复制
相关文章
c++中结构体struct的初始化和赋值操作
原文链接:https://www.cnblogs.com/my_life/articles/10935859.html
acoolgiser
2019/11/12
17.1K0
C#中的元组(Tuple)和结构体(struct)
在正常的函数调用中,一个函数只能返回一个类型的值,但在某些特殊情况下,我们可能需要一个方法返回多个类型的值,除了通过ref,out或者泛型集合可以实现这种需求外,今天,讲一下元组和结构体在这一方面的应用。
宿春磊Charles
2022/03/29
8990
C#中的元组(Tuple)和结构体(struct)
详说C#中的结构struct
1、结构的级别和类一致,写在命名空间下面,可以定义字段、属性、方法、构造方法也可以通过关键字new创建对象。
vv彭
2020/10/27
6740
详说C#中的结构struct
C++中关于指针初始化和使用NULL的理解
1、严禁使用未被初始化的指针:C++创建指针的时候,只分配存储地址的内存,并不会分配存储数据的内存,所以指针可能指向任何位置。    (1)使用解除运算符(*)之前,一定要对指针初始化,否则若声明的指针刚好指向程序代码的位置会导致一些很隐蔽的错误。    (2)未被初始化之前禁止指针之间的赋值。 例如: #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) {
用户1215536
2018/02/05
2.8K0
C++中关于指针初始化和使用NULL的理解
Go基础系列:struct和嵌套struct
struct定义结构,结构由字段(field)组成,每个field都有所属数据类型,在一个struct中,每个字段名都必须唯一。
李海彬
2018/12/18
4.3K0
C# 中 Struct 和 Class 的区别总结
结构体(struct)是类(class)的轻量级版本。结构体是值类型,可用于创建行为类似于内置类型的对象。
zls365
2021/04/02
1.3K0
关于page_struct中virtual指针的思考
其中 virtual 居然直接 指向物理页面的起始地址,不是单单根据图推断的,文章内容也是这么描述的
执生
2020/10/29
5790
关于page_struct中virtual指针的思考
swift 中类(class)和结构体(struct)区别
引用类型:将一个对象赋值给另一个对象时,系统不会对此对象进行拷贝,而会将指向这个对象的指针赋值给另一个对象,当修改其中一个对象的值时,另一个对象的值会随之改变。
菜菜不吃蔡
2020/08/28
1.2K0
【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )
结构体中 嵌套 二级指针 , 二级指针 可以使用 指针数组 / 二维数组 / 自定义二级指针内存 三种内存模型的任意一种 ;
韩曙亮
2023/03/30
1.8K0
【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )
C语言之指针中的&和*浅析
不知道大家在看objective-c中runtime和block源码的时候是不是比较费脑子,原因可能就是C语言的一些基础的东西理解不是特别深刻,今天就带大家看看C语言中指针的基础概念。
roc
2019/07/31
1.5K0
C语言之指针中的&和*浅析
C++中this指针的理解和用法
当你进入一个房子后, 你可以看见桌子、椅子、地板等, 但是房子你是看不到全貌了。 对于一个类的实例来说, 你可以看到它的成员函数、成员变量, 但是实例本身呢? this是一个指针,它时时刻刻指向你这个实例本身。
全栈程序员站长
2022/08/29
6800
C/CPP结构中的字符数组和字符指针
一般情况下我们在结构中都使用字符数组来存储字符串,是否可以使用指向char的指针来代替字符数组呢?
CtrlX
2022/10/04
1.5K0
Spark Java UDAF 输入struct嵌套结构
虽然Spark3.0.0的官方文档1已对Spark Java UDAF进行了说明,并且有example代码。因此本文主要解决在实际开发过程中,遇到的2种问题:
mikeLiu
2020/08/11
2.1K1
C语言指针的初始化和赋值
指针初始化时,“=”的右操作数必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是int*p=0;除外,该语句表示指针为空)。此时,*p只是表示定义的是个指针变量,并没有间接取值的意思。
全栈程序员站长
2022/08/01
2.7K0
C语言指针的初始化和赋值
Go中struct初始化内存布局情况
在Go中,struct可以理解为是一种封装数据类型,其内部可以是函数、变量、接口等等任何类型,struct也是一种值类型数据。今天分享struct不同方式的初始化,内存有什么不同。
兔云小新LM
2022/11/21
5060
Go中struct初始化内存布局情况
C语言的struct和typedef struct
分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef:
狼啸风云
2022/11/21
8590
c中的指针和直接引用结构体的编译后的差异
PVirtualMachine lvm = ghook.init(&ghook); //sizeof(TStringList);//testihook();//SPlog64(2,9); 00007FF64EF1FA7C lea rcx,[_ghook (07FF64F0AD359h)] 00007FF64EF1FA83 call qword ptr [_ghook+148h (07FF64F0AD4A1h)] 00007FF64EF1FA89 mov
战神伽罗
2019/07/24
6950
【C++】C++ 类中的 this 指针用法 ① ( C++ 类中的 this 指针引入 | this 指针用法 | 代码示例 )
在 C++ 类中 , this 指针 是一个特殊的指针 , 由系统自动生成 , 不需要手动声明定义 , 在类中的每个 非静态成员函数 中 , 都可以调用 this 指针 ;
韩曙亮
2023/10/15
3640
【C++】C++ 类中的 this 指针用法 ① ( C++ 类中的 this 指针引入 | this 指针用法 | 代码示例 )
C++中this指针的本质
一直以来对C++中的this不理解,只知道在构造函数中,如果构造函数的参数和类成员的名字一样的话,就可以用this指针来区分,如:
全栈程序员站长
2022/08/29
7660
C++中this指针的本质
点击加载更多

相似问题

在C中访问另一个结构中的struct指针

42

如何访问嵌套在另一个结构中的Struct (通过指针访问)的成员(也通过指针访问)?

24

C中的struct指向结构的指针

34

C中有指针的问题,struct中的结构和malloc中的结构

11

C中的嵌套结构和指针

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文