Last Updated: 2023-12-12 04:52:35 Tuesday
-- TOC --
union定义的是一块内存,其内部成员共享这块内存,这块内存与size最大的成员一样。
定义union的语法与struct基本一致,只是将关键词换成union
,其成员存取代码的书写方式(notation)也与struct一样。
union data {
int n;
char ch;
short m;
};
union的所有成员共用一块内存区域,这块内存的大小以能够放下的最大成员的size为准。在代码中,由程序员负责,必须先对某个成员赋值,然后再取此成员的值,如果没有这样的存取对应,数据会异常,因为所有成员共享这块内存(除非程序员知道自己在干什么)。
一般需要一个indicator来说明当前可以使用union的哪个具体成员。
《CSAPP》中关于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 --