C语言Union踏坑

目录

 

简介

案例分析


简介

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的成员有两个:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值