共用体和结构体

余生长醉 提交于 2019-11-27 02:21:06

编译器会为结构体变量中的每个数据成员分配不同的地址空间,也就是说,结构体变量中的数据程序是并列关系,而编译器为共用体变量中的数据成员分配的是同一块内存,每个时刻只有一个数据成员有意义,从地址的角度来看两者的差异,形象地表明了这一点

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//初始化方式和结构体类似
union data{   //类似于结构体变量,共享内存,共用体的大小等于最长的那一段,共用体变量在任何时刻只有一个成员变量存在,定义的时候不能初始化,只有在创建的时候才能初始化
    int price;
    char brand[20];
}d1, d2, *pData, data[10];

union key{    //共用体会存在字节数填充,直到可以被最小类型字节数整除,double有8个字节,a数组有9个,再填充7个字节,恰好被double整除
    //内存对齐的方式,分别CPU寻址
    double d;
    char a[9];
} k;   //sizeof(k) =16
void main(){
    printf("%d\n", sizeof(d1)); //20
    d1.price = 100;
    strcpy(d1.brand,"IBM");
    d2 =d1;   //共用体变量可以直接赋值
    printf("%d,%s\n",d1.price,d1.brand);  //5063241,IBM  只正确显示,最后一个赋值的变量,其他的数据解析为错误数据,因为他们共用一段内存

    union data uniondata = {100 }; //大括号初始化时,只能初始化第一个成员变量!!!共用同一片空间

    //共用体变量的三种引用方式和结构体变量类似
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!