返回介绍

6. 联合

发布于 2024-10-12 21:58:09 字数 1452 浏览 0 评论 0 收藏 0

结构体(struct)各成员(field)具有不同内存位置,联合体(union)各成员共享相同起始位置。简单点说,就是以不同视角(field: type)访问同一数据。

内存长度由最长的成员决定。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

union date {                    // 4 字节数据:  
    int           _d;           //   . _d: 以整数访问。
    unsigned char _b[4];        //   . _b: 以字节数组访问。
                                //   . date: 以结构体访问。
    struct {
        signed   short year;
        unsigned char  month;
        unsigned char  day;
    } date;
};

int main (void)
{
    union date d = { .date = { 2021, 4, 12 } };    

    // 按最长成员。
    assert(sizeof(d) == 4);   
    
    // 各成员共享同一内存,同一起始地址。
    assert((void *)(&d._d) == (void *)(&d.date)); 

    // 以不同方式共享同一数据。
    assert((signed short)(d._d) == d.date.year);
    assert(d._b[2] == d.date.month);
    assert(d._b[3] == d.date.day);

    return 0;
}
    |  2021   |  4 | 12 |
    v
    +====+====+====+====+
    | e5 | 07 | 04 | 0c |
    +====+====+====+====+
    ^
    | _d: int
    | _b: byte[4]
    | date: struct { year, month, day }
    

初始化

无 .member 初始化,只第一个有效。

union date d = { 10, (unsigned char[]){100, 101, 102, 103}};
                     ^ warning: excess elements in union initializer
assert(d._d == 10);

使用 .member,最后一个表达式有效。

union date d = { .date = {2021, 4, 12}, ._d = 10 };    
assert(d._d == 10);  

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文