zoukankan      html  css  js  c++  java
  • Union联合体

    一. union的声明和struct类似

    1 union 名称 {
    2     //成员变量
    3 };
    4 
    5 typedef union {
    6     //成员变量
    7 }名字;

      

    二. 内存分配

    1. union内存大小需要满足以下2个条件:

      1> 大于或等于union中最长的成员变量的长度;

      2> 能整除其他成员变量长度

    文字描述计算过程:U001中的成员变量 int number->4字节,char c[10]->10字节,double tmp->8字节,  要大于或等于10,还需要能整除4和8,U001的大小为16字节

     

    2. union中的成员变量是不共存的,所有成员变量的起始地址相对于union基地址偏移量都是0,即union创建时分配的内存空间,所有的成员变量共用,新值会覆盖旧值

     

    3. 判断union起始地址是低地址还是高地址

    从Log可以看出c[0]地址小于c[1],所以在我的机子上,union起始地址是低地址,即小端little-endian

    4. union怎么存储和读取成员变量的值

    ASCII字符‘A’对应16进制41、10进制65,‘B’对应16进制42、10进制66,'C'对应16进制43、10进制67, 'D'对应16进制44、10进制68

    char类型1个字节,int4个字节,给联合体实例u1的成员变量char c[10]前4个字节赋值,正好对应int的4个字节,

    以16进制形式打印u1.number可以得到44434241,说明union的存取是这个样子的:

      4-1> 创建出联合体实例u1后,u1的内存如下

      4-2> 赋值u1.c[0] = 'A'; 成员变量char c[10]拥有10个字节长度,c[0]从低地址开始找到第1个字节即byte0, 赋值u1.c[0]后,内存变为:

      4-3> 赋值u1.c[1] = 'B'; 从低地址开始找到第2个字节即byte1, 赋值u1.c[1]后,内存变为:

      4-4> 赋值u1.c[2] = 'C'; 从低地址开始找到第3个字节即byte2, 赋值u1.c[2]后,内存变为:

      4-5> 赋值u1.c[3] = 'D'; 从低地址开始找到第4个字节即byte3, 赋值u1.c[3]后,内存变为:

      4-6> 读取u1.number, int类型4个字节,从低地址依次读取4个字节byte0 byte1 byte2 byte3,

    将这4个字节按照从高地址到低地址排列组合为byte3 byte2 byte1 byte0

    即 获取内存中字节时从低地址开始,将获取的字节从高地址到低地址排序,得到的值才是变量的值

  • 相关阅读:
    android中requestFocus
    @SuppressLint("NewApi")和@TargetApi()的区别
    Gradle基础
    Gradle build-info.xml not found for module app.Please make sure that you are using gradle plugin '2.0.0-alpha4' or higher.
    Duplicate files copied in APK META-INF/DEPENDENCIES
    解决Gradle DSL method not found: ‘android()’
    SSL peer shut down incorrectly
    如何测试远端TCP和UDP端口是否开放
    方法总比困难多
    图灵简传
  • 原文地址:https://www.cnblogs.com/xieyajie/p/8086861.html
Copyright © 2011-2022 走看看