结构体和联合体嵌套访问

这篇具有很好参考价值的文章主要介绍了结构体和联合体嵌套访问。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在JSON项目中,使用了联合体和结构体之间的嵌套,但是在访问内部的联合体和结构体的时候出现了问题,这篇文章作为记录,也希望能帮助遇到相同问题的好伙伴。

struct lept_value
{
    union 
    {
        struct str
        {
            char *s;
            size_t len;
        };

        double n;
    };

    lept_type type;
};

上面是最原始的代码,上面的代码可以通过下面的代码访问double n和lept_type type,

// v是一个lept_value的指针
v->n;
v->type;

但是无法访问str结构体内部的成员。如果给结构体加上名,那么连n也无法访问。例如:

struct lept_value
{
    union m_union
    {
        struct str
        {
            char *s;
            size_t len;
        };

        double n;
    };

    lept_type type;
};

我用下面的代码访问发现只提示有type一个成员。

v->m_union.str;        // 无法访问

v->m_union.n;          //无法访问

v->type;                    // 可以访问

后来通过翻译将问题翻译成英文:

如何访问结构体内部的联合体中的变量->How do I access variables in a union inside a struct

之后放到StackOverflow上进行了查询,很快有了结果,原解释如下:c++ - Accessing a variable in a union which is inside a class - Stack Overflow

typedef struct {
    union {
        struct { char* s; size_t len; }s;  /* string: null-terminated string, string length */
        double n;                          /* number */
    }u;
    lept_type type;
}lept_value;

参考了c语言的代码和StackOverflow上的回答,发现自己简直s b一个。

问题的原因在于:我的代码中只是声明了结构体,但是实际上并没有生成实际的对象,根本就没有这个成员,因此当然无法访问。就像使用lept_value这个数据结构,需要一个实际的对象才会分配内存,光给出声明怎么会允许访问呢?将代码修改成如下,加入了m_data和m_union,意味着默认有这两个实例,有了实例之后一切的访问都可以了(struct和union默认访问权限是public)。

struct lept_value
{
    union 
    {
        struct str
        {
            char *s;
            size_t len;
        }m_data;

        double n;
    }m_union;

    lept_type type;
};

// 访问方式
v->m_union.m_data.s;
v->m_union.n;
v->m_union_m_data.len;

问题到这里就解决了,后来想到vscode写代码的时候,每次提示都只显示一个type,别的显示不出来,这不就是在告诉我,你TM这个结构体里面根本没有这个成员变量!!!恨不得抽自己几个大嘴巴子。文章来源地址https://www.toymoban.com/news/detail-721850.html

到了这里,关于结构体和联合体嵌套访问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【基础知识】结构体(struct)和联合体(union)

    目录 1. 结构体(Struct) 1.1 C++ 结构体和 C 语言结构体的区别 1.2 结构体的对齐方式 2. 联合体(Union) 2.1 联合体特性 3. 结构体和联合体的区别         在 C 语言中,结构体是一种自定义的复合数据类型,允许将不同数据类型的变量组合成一个单一的实体。结构体可以包含多个

    2024年02月07日
    浏览(41)
  • C/C++之自定义类型(结构体,位段,联合体,枚举)详解

    专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 个人主页:点我进入主页   1.前言 2.结构体 2.1结构体声明 2.2结构体初始化 2.3结构体的自引用 2,4结构体的内存

    2024年02月08日
    浏览(39)
  • C语言中的“三体”大佬们知道是什么吗? —— 结构体、枚举、联合体

    目录 前言 结构体 基本概念 结构体类型的声明 结构的声明 特殊的声明 结构的自引用 结构体变量的定义和初始化 结构体的对齐规则: 为什么要内存对齐 修改默认对齐数 修改默认对齐数的预处理命令 实际例子 结构体传参 结构体实现位段(位段的填充) 位段 什么是位段 位

    2024年02月12日
    浏览(65)
  • C语言学习(三十一)---结构体、联合体的在内存中的存储

    在上一篇文章中,我们学习了 枚举 、 位段 和 联合体 的相关内容,在文章的末尾,我们还差了关于 联合体的存储 问题的内容,今天我们将学习该部分的内容,好了,话不多说,开整!!! 结构体 在内存中是如何存储的呢,是按里面的变量内容,在 内存中的连续地址中存

    2024年02月12日
    浏览(41)
  • 【C语言】一篇文章深入解析联合体和枚举且和结构体的区别

    联合体( union )是允许一个变量通过不同的接口访问内存的一种数据类型,表示一个变量可以存储不同类型的值,而枚举是使用 enum 定义一组相关且互斥的整形常量集合。本章阿森将和你学习联合体类型的声明,特点,有关大小的计算,还有枚举类型的声明,优点和使

    2024年02月03日
    浏览(51)
  • 一篇博客学会系列(2)—— C语言中的自定义类型 :结构体、位段、枚举、联合体

    目录  前言 1、结构体 1.1、结构体类型的声明 1.2、特殊的结构体类型声明 1.3、结构体的自引用 1.4、结构体的定义和初始化 1.5、结构体成员变量的调用 1.6、结构体内存对齐  1.6.1、offsetof 1.6.2、结构体大小的计算 1.6.3、为什么存在内存对齐?  1.7、 修改默认对齐数 1.8、结构

    2024年02月08日
    浏览(41)
  • 联合体(C语言)

    小伙伴们又来学习知识啦~,今天我要给大家介绍一下联合体的使用,话不多说,我们开始今天的正题吧! 联合体的介绍 C语言的联合体(union)是一种特殊的数据类型,它可以在同一内存空间中存储不同的数据类型。与结构体类似,联合体也可以定义多个成员,但是这些成员

    2024年02月04日
    浏览(47)
  • 联合体union

    结构体中的成员彼此是独立存在的,分布在不同的内存单元中 共用体的成员是“一体的”,使用同一个内存单元 小端:高位地址在高位,低位地址在低位 大端:高位地址在低位,低位地址在高位     

    2024年02月13日
    浏览(38)
  • 十五、联合体(union)

    十五、联合体(union) 1、union语法 ​ 联合体和结构体都是自定义数据类型 ,通过union可以创建一个联合体,union中的成员变量 共享内存 (即内存中有重叠的部分),因此union的数据类型大小由其最大的成员变量决定。 2、union的特点及使用 ①union中任意一个成员变量的变动,

    2024年02月05日
    浏览(49)
  • 自定义类型——枚举与联合体

    枚举顾名思义就是一一列举 把可能的取值一一列举 以上定义的 enum Day , enum Sex 都是枚举类型  { }中的内容是枚举类型的可能取值,也叫 枚举常量 这些可能取值都是有值的,默认从0开始,一次递增1 当然在定义的时候也可以赋初值 例如: 我们可以使用 #define 定义常量,为

    2023年04月19日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包