C语言中struct与union的区别

时间:2022-09-05 16:08:37

最近开始自学C语言,从最基础部分的开始学起。今天看书的时候注意到了struct和union似乎很像,除了名字不同,看起来几乎没有区别。

既然C中定义了struct和union两个关键字,那么它们肯定是有区别的,在查了一些资料之后我终于知道两者最大的区别就在于内存利用。

首先看下面一段程序:

#include<stdio.h>
union uni
{
    int a;
    char b;
};
struct str
{
    int a;
    char b;
};
int main(int argc, char** argv)
{
    printf("%d %d\n", sizeof(union uni), sizeof(struct str));
    return 0;
}

程序编译运行之后输出结果为:

4 8

由此可见,在成员完全相同的情况下,struct比union占用的内存要多一些。真正的原因是C中struct和union的内存分配机制不同:

在struct中,所有的成员都有自己的存储空间,而且为了便于寻址和管理,所有的数据成员都要遵循内存对齐的规则;

在union中,所有的成员共用一块存储空间,在操作不同的成员时,编译器依据不同的成员类型,按照不同的方式取值,具体例子见以下代码:

#include <stdio.h>
int main(int argc, char** argv)
{
    union
    {
        short i;
        struct
        {
            char a;
            char b;
        }str;
    }uni;
    uni.i = 0x4241;
    printf("%c%c\n", uni.str.a, uni.str.b);
    uni.str.a = 'a';
    uni.str.b = 'b';
    printf("%x\n", uni.i);
    return 0;
}

程序编译运行之后输出为:

AB
6261

很显然,我们对union中的某个成员进行的操作能够影响到其他成员。