C语言练习笔记 ~ 联合体(共用体)

文章目录

  • 例1 查看联合体所占内存长度
  • 例2 共享内存的缺陷
  • 例3 将例1换一种方式

联合体 union 是一个能在同一个存储空间存储不同类型数据的类型。

联合体所占的内存长度等于其最长成员的长度,也有叫做共用体。

联合体虽然可以有多个成员,但同一时间只能存放其中一种。

例1 查看联合体所占内存长度

#include 
#include 
#include 
#pragma warning(disable:4996)

union A
{
    int a1;
    short a2;
    char a3;
};

 int main () 
{ 
   union A a;
   a.a1 = 1;
   printf("%u\n",sizeof(a));

   return 0;
}

输出结果:
在这里插入图片描述
从上述结果可以看出,联合体a 中三个成员共享一个内存; 但是这样使存在缺点的,如下所示:

例2 共享内存的缺陷

#include 
#include 
#include 
#pragma warning(disable:4996)

union A
{
    int a1;
    short a2;
    char a3;
};

 int main () 
{ 
   union A a;
   a.a1 = 1;
   printf("%u\n",sizeof(a));
   a.a3 = 10;
   a.a1 = 0;
   printf("%d\n",a.a3);

   return 0;
}

输出结果:
C语言练习笔记 ~ 联合体(共用体)_第1张图片
从上述结果可以看出,一旦将a1设置为0,则a3的值也变为0;我们可以打印三个变量的地址,看是否一致:

#include 
#include 
#include 
#pragma warning(disable:4996)

union A
{
    int a1;
    short a2;
    char a3;
};

 int main () 
{ 
   union A a;
   a.a1 = 1;
   printf("%u\n",sizeof(a));
   a.a3 = 10;
   a.a1 = 0;
   printf("%d\n",a.a3);
   printf("%p, %p, %p\n", &a.a1, &a.a2, &a.a3);

   return 0;
}

输出结果:
C语言练习笔记 ~ 联合体(共用体)_第2张图片
从上面结果可以看出,三个成员变量地址相同,证明是在同一块内存里。

例3 将例1换一种方式

#include 
#include 
#include 
#pragma warning(disable:4996)

union A
{
    int a1;
    short a2;
    char a3;
};

 int main () 
{ 
   union A a;
   a.a1 = 1;
   printf("%u\n",sizeof(a));
   a.a3 = 10;
   a.a1 = 0;
   printf("a.a3=%d\n",a.a3);
   printf("%p, %p, %p\n", &a.a1, &a.a2, &a.a3);
   a.a1 = 0x12345678;
   a.a3 = 0;
   printf("a.a1=%x\n",a.a1);

   return 0;
}

输出结果:
C语言练习笔记 ~ 联合体(共用体)_第3张图片
从上述结果可以看出,a1的值并没有变成0,而只是最后两位变成了0,这就和 union A 中定义的变量类型有关了,a1是int型,4个字节,占8个bit; a3是char 型,1个字节,占2个bit。所以只会将后两位置0。

注意:联合体中出现指针的话,一定要注意使用方式,例如下面的使用方式就是错误的:

#include 
#include 
#include 
#pragma warning(disable:4996)

union A
{
    int a1;
    short a2;
    char a3;
    char *p;
};

 int main () 
{ 
   union A a;

   a.p = malloc(10);//假设这块堆内存的编号为0x12345
   a.a1 = 0; // p的值也成了0了
   free(a.p); //这样会造成内存泄漏,程序会崩溃的

   return 0;
}

你可能感兴趣的:(C语言,联合体,共用体)