目录

简介

案例分析


简介

C语言中的联合体Union可以说是非常冷门的一个关键字了,平时基本不怎么会用到。它的定义格式如下:

union 联合体名{成员列表
};例如:
union data{int n;char ch;double f;
};

可以看到联合体union和常用的结构体struct在定义上非常相似。二者的区别如下:

1.结构体的各个成员会占用不同的内存,互相之间没有影响;而联合体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

2.结构体占用的内存大于等于所有成员占用的内存的总和(字节对齐问题);联合体占用的内存等于最长的成员占用的内存。

可以看到联合体和结构体最大的区别就在于联合体内所有成员公用同一块内存,这也就导致联合体内保存指针成员会变得非常危险。

案例分析

最近在debug一个空指针异常时,遇到了类似如下代码:

#include <stdio.h>union Test
{int *a;unsigned x;
};int main()
{union Test t;int i = 0;t.a = &i;printf("%p %d\n", t.a, *(t.a));t.x = 1;printf("%p %d\n", t.a, *(t.a));return 0;
}

可以看到联合体Test的成员有两个:int指针和unsigned。首先是对联合体的指针成员进行赋值,然后又对联合体的unsigned成员进行赋值。由于联合体内成员是共用同一块内存的,因此修改unsigned的值时,同时也修改指针的值,这样做是非常危险的。在Ubuntu18.04上测试上述代码,直接引起了段错误:

0x7ffcc123cc5c 0
Segmentation fault (core dumped)

C语言Union踏坑相关推荐

  1. C语言union避坑

    什么是共用体? 与结构体不同,共用体的成员变量是共用一片内存,占用的空间大小是这个共用体的最大的成员变量大小,所以一个成员变量改变,将会影响到其他成员变量. 共用体使用场景 使用共有体,共用一片内存, ...

  2. R语言union函数计算数据对象(vector、list、dataframe)的并集:union函数计算两个vector向量、dataframe、列表list的并集

    R语言union函数计算数据对象(vector.list.dataframe)的并集:union函数计算两个vector向量.dataframe.列表list的并集 目录

  3. Reactjs 踏坑指南3:一些例子(未完成)

    React 踏坑指南3: 准备工作 知识准备 Reactjs 踏坑指南1: 一些概念 Reactjs 踏坑指南2: JSX&&组件 文件引用 引用文件 文件基本结构 <!DOCT ...

  4. DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描...

    DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描 liuyuhang原创,未经允许禁止转载    系列目录连接 DB数据源之Spr ...

  5. Reactjs 踏坑指南1: 一些概念

    Reactjs 踏坑指南1: 知识点 什么是React 虚拟DOM JSX 组件 生命周期和状态 事件 单项数据流 Reactjs和Angularjs的对比 React简介 React是一个Faceb ...

  6. spring中怎么访问MySQL过程_DB数据源之SpringBoot+MyBatis踏坑过程(六)mysql中查看连接,配置连接数量...

    DB数据源之SpringBoot+MyBatis踏坑过程(六)mysql中查看连接,配置连接数量 liuyuhang原创,未经允许禁止转载 系列目录连接 1.环境说明 mysql5.0以上版本. wi ...

  7. C语言union总结

    C语言union总结 最近在工作中看到前辈写了串代码,使用union,加深了对C语言的认识,感叹C语言的博大精深! 需要实现的功能: 从模块有5个按键,每个按键有5种状态.主模块与从模块串口相连.当从 ...

  8. springboot+feign+nacos+seata+docker整合踏坑实录

    springboot+feign+nacos+seata+docker整合踏坑实录 一.版本 springboot:2.7.2 feign:3.1.5 jdk:19 seata:1.5.2 nacos ...

  9. c语言马踏棋盘编程分析,C语言马踏棋盘实现

    原标题:C语言马踏棋盘实现 问题描述 国际象棋的棋盘为8×8的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动 ...

最新文章

  1. PCL1.8.1安装和一些小错误
  2. SQLite的锁的原理:
  3. chown -R命令的使用
  4. 究竟是什么可以比反射还快实现动态调用?
  5. 欧洲的数据中心与美国的数据中心如何区分?
  6. 【Mysql】数据库主从搭建-基于docker
  7. 信息学奥赛一本通 1308:【例1.5】高精除
  8. bs cs架构区别_一文了解微蜂窝、基站、宏蜂窝、直放站、BBU+RRU到底有什么区别...
  9. 日程表模板html,excel日程表模板(每日工作时间表模板)
  10. 从oracle临时表理解会话与链接
  11. Linux WiFi使用
  12. 云服务器虚拟化搭建,虚拟化搭建云服务器
  13. input限制只能输入数字,限制输入数字长度或者大小
  14. 【已解决】Unknown error 1146
  15. Redux 异步数据流-- thunk中间件源码解析
  16. 在maven中创建jsp依赖
  17. c语言数组中逗号的作用,c语言练习(4)--逗号分割字符串形成二维数组
  18. 贝叶斯函数编程,测试男女性别数据
  19. 湖畔大学曾鸣演讲:从0到0.1最难,伟大如何孕育于此?
  20. Combining Compositional Models and Deep Networks For Robust Object Classification under Occlusion阅读

热门文章

  1. Vector3基础和Transform位置
  2. 位运算专题一:位与、位或、位反
  3. 研习社|智能物流|千人人脉俱乐部
  4. C语言字符串输入输出
  5. STINGY SAT
  6. 美容护肤:春天四类方案拯救过敏肌肤秘籍 - 生活至上,美容至尚!
  7. Vuex 终极秘籍总结
  8. 客户关系管理电子商务忠诚度
  9. js赋值后 改变现有数据会修改原来的数据的解决办法
  10. 锐捷交换机VSU 配置LACP聚合端口