union的定义和使用

Last Updated: 2023-12-12 04:52:35 Tuesday

-- TOC --

union定义的是一块内存,其内部成员共享这块内存,这块内存与size最大的成员一样。

定义union

定义union的语法与struct基本一致,只是将关键词换成union,其成员存取代码的书写方式(notation)也与struct一样。

union data {
    int n;
    char ch;
    short m;
};

union的所有成员共用一块内存区域,这块内存的大小以能够放下的最大成员的size为准。在代码中,由程序员负责,必须先对某个成员赋值,然后再取此成员的值,如果没有这样的存取对应,数据会异常,因为所有成员共享这块内存(除非程序员知道自己在干什么)。

c_union

一般需要一个indicator来说明当前可以使用union的哪个具体成员。

union的应用场景

《CSAPP》中关于union这一段,提到了下面两个应用场景:

用union判断字节序

看到union的一个应用,代码利用了共享内存块这个特点,通过union的一个成员,实现对另一个成员byte级别的访问。比如下面这段代码,将short变量的每个byte拿出来分析,以判断系统的byte order:

#include <stdio.h>

int main(void) {
    union {
        short a;
        char c[2];
    } un;

    un.a = 0x0102;

    if ((un.c[0]==1) && (un.c[1]==2))
        printf("big endian\n");
    else if ((un.c[0]==2) && (un.c[1]==1))
        printf("little endian\n");

    return 0;
}

指针总是指向变量的低地址!这就是调用栈的设计要从高地址向下扩展的原因。

看下面的这段代码:

#include <stdio.h>

/**
* 0: little endian
* 1: big endian
*/
int byte_order(void) {
    int a = 1;
    return *(char*)&a == 1 ? 0 : 1;
}

int main(void) {
    printf("%d\n", byte_order());
    return 0;
}

byte_order函数在little endian时返回0,big endian时返回1.

指针地址是内存地址,内存就是一个大型的array,对于任意type存放在内存中,其指针总是指向低地址,这样在执行+1操作的时候,才能自然的从低地址移动到高地址。

本文链接:https://cs.pynote.net/sf/c/202111261/

-- EOF --

-- MORE --