C语言联合体内存分布详解:低字节、高字节与字节序
C语言联合体内存分布详解:低字节、高字节与字节序
在C语言中,联合体(union)是一种特殊的结构体,其所有成员共享同一块内存空间。这意味着,在任何时刻,只有一个成员的值是有效的。
示例:联合体的内存分布
以下示例代码展示了联合体是如何工作的:
#include <stdio.h>
int main(int argc, char const *argv[]) {
union {
short i;
char a[2];
} u;
u.a[0] = 0x11;
u.a[1] = 0x22;
printf('0x%x\n', u.i);
return 0;
}
在这个例子中,联合体 u 包含两个成员:一个 short 类型的整数 i 和一个 char 类型的数组 a[2]。
当我们给数组 a 赋值时,根据系统的字节序,内存中的存储方式是从低字节到高字节或从高字节到低字节。在这个例子中,我们先给 a[0] 赋值为 0x11,然后给 a[1] 赋值为 0x22。由于数组是从低地址开始存储的,所以 0x11 会被存储在低地址处,0x22 会被存储在高地址处。
当我们访问联合体的 i 成员时,由于 i 和 a 共享同一块内存空间,所以它们的值是相同的。在这个例子中,0x11 和 0x22 分别是 i 的低字节和高字节。由于系统的字节序可能是小端或大端,所以打印出的结果可能是 0x2211 或 0x1122。
如何判断系统字节序
要确定系统的字节序,可以使用 sizeof 函数来查看联合体的大小。如果 sizeof(u) 等于 2,则系统是小端序;如果 sizeof(u) 等于 4,则系统是大端序。
总结
- 联合体成员共享同一块内存空间。
- 联合体内存分配遵循系统字节序,低地址存储低字节,高地址存储高字节。
- 可以使用
sizeof函数判断系统字节序。
希望本文能够帮助您更好地理解 C 语言中联合体的内存分布,以及字节序的概念。
原文地址: https://www.cveoy.top/t/topic/qiqR 著作权归作者所有。请勿转载和采集!