c语言共用体赋值问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言共用体赋值问题相关的知识,希望对你有一定的参考价值。

union struct char c1; char c2; b;a;为什么执行a.x=0x1234后,a.b.c1的值为0x34,a.b.c2的值为0x12;为什么是这样,小弟没分,十分抱歉,谢谢大家!

有没有分无所谓,本人很乐意回答你的疑惑。

共同体,顾名思义,里面的成员共享一块内存空间。
你这里面x没有写出来,估计是定义成一个整数。在32位系统下,整数占用32位内存,也就是4个字节。由于结构体里面只有两个char,所以占用两个字节的内存。共享了整数的前两个字节的内存空间。整个结构体所占用的内存就是两个成员最多的4个字节。

当我们执行a.x=0x1234的时候,这4个字节大小的空间便被这个整数填满。由于Intel X86处理器的字序原因(小尾,Little end),内存从低地址到高地址是这样被填满的。
34 12 00 00
看起来这个数字是倒过来的。
由于b.c1使用该共同体的第一个字节,所以b.c1的值为0x34,b.c2也就是0x12了,假如你的结构体有c3,c4,那么c3,c4就是00了。

这个结果和CPU的字序息息相关,有一些处理器字序是“大尾(Big end)",比如sparc,0x1234在内存中的排列是
00 00 12 34
这样,得出的结果就是c1 = 00, c2 = 00, c3 = 0x12, c4 = 0x34。
参考技术A 首先:在我们常用的系统中,存放的变量经常是从右向左存放的.比如你定义了c1和c2那么在计算机内存是这样的顺序: c2,c1你的共用体好像有个问题,我没发现X的定义不过我假设你的X是个int,那么x与C2,C1共用同一块内存,这就是共用体的意思当你给x赋值,也是给C2,c1赋值,并且0x12放到了C2的位置,34放到了C1位置所以,就产生了你所说的结果

C语言 共用体

//共用体  union
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

// union  共用体,构造数据类型,也叫联合体,用途:十几个不同类型的变量共占一段内存(相互覆盖)

//共用体在类型定义的时候并不分配内存,定义共用体变量的时候才分配内存
union data{
    char c;
    int a[10];
}udat1;

union stu{
    int a;//内部变量无法初始化,因为类型定义不会分配内存
    char name[10];
}fisr, *fisr1, fisr2[10];//共用体定义形式①
//注意:在定义共用体变量的时候初始化也只能初始化第一个成员变量,无法对其他成员变量初始化

//匿名公共体--匿名共用体无法定义变量,只能在初始化的时候定义变量
//这样就限定了共用体变量的个数,一般用于给某些特殊权限的人使用的变量
union {
    char c;
    int a[10];
}lastp;


struct tes{
    int num;
    char name[40];
}tes1 = {4,"feiyu"},tes2;

//共用体变量占据的内存单元的个数应大于或者等于是其内部最大数据成员占据内存单元数。
//结构体,共用体在内存中存储,字节对齐
//data是共用体,共用体大小必须至少包含最大的成员数据,所以其原始大小是sizeof(int)*10 = 40字节,
//union {
//    char c; 
//    int a[10];
//};
//因为data其原始大小正好是最宽基本类型成员int的倍数,不用填充字节
//所以共用体data的大小是40

//stu是共用体,stu的原始大小是sizeof(char)*10字节,根据字节对齐原则,最宽基本类型成员是int,需要填充字节
//所以共用体stu的大小是12

//总结:共用体大小必须至少包含最大的成员数据,并且可以整除最宽基本类型成员--详情见结构体
void main(){
    //验证共用体的字节对齐原则
    printf("验证共用体的字节对齐原则--%d\n", sizeof(udat1));
    printf("验证共用体的字节对齐原则--%d\n", sizeof(fisr));
    //定义共用体
    union stu stuinfo;//共用体定义形式②
    //共用体的赋值
    stuinfo.a = 40;
    //共用体变量任何时候只有一个成员存在,当存在一个成员,却给给其他成员赋值的时候,后面会覆盖前面
    //因为共用体是共占一段内存,不会给每个成员变量都分配一块内存
    strcpy(stuinfo.name, "联想");
    printf("共用体成员变量a=%d;name=%s\n", stuinfo.a, stuinfo.name);
    //结果发现成员变量a被覆盖了
    union stu stuinfo2 = stuinfo;//共用体变量可以直接赋值
    printf("共用体成员变量a=%d;name=%s\n", stuinfo2.a, stuinfo2.name);
    tes2 = tes1;//结构体变量可以直接赋值
    printf("结构体成员变量num=%d,name=%s\n", tes2.num, tes2.name);
    system("pause");
}

 

技术分享

以上是关于c语言共用体赋值问题的主要内容,如果未能解决你的问题,请参考以下文章

c语言共用体包含一个数组成员,我要对这个数组成员进行赋值,一定要一个一个的赋值么?不能写在花括号

C语言共用体

c语言里,怎样判断共用体union的数据类型?

C++中为何不能对共用体变量名赋值?

C语言之共用体类型

C语言—联合体/共用体