精华内容
下载资源
问答
  • 联合体union

    2021-06-08 09:37:51
    union data { short st; char cs[2]; }; int main() { union data x = {};... // 高地址存放高位 printf("小端\n"); } else { printf("大端\n"); } return 0; } union data { char ch;.

    在这里插入图片描述

    union data {
        short st;
        char cs[2];
    };
    
    int main() {
        union data x = {};
        x.st = 0x0001;
        if (x.cs[1] == 0) {
        	// 高地址存放高位
            printf("小端\n");
        }
        else {
            printf("大端\n");
        }
        return 0;
    }
    
    union data {
        char ch;   // 1 + 3
        // 哑元结构
        union {    // 4
            float f;
            int i;
        };
    };
    
    
    int main() {
        printf("%ld\n", sizeof(union data)); // 4
        return 0;
    }
    
    // 此时data1有2个成员,ch和联合体
    struct data1 {
        char ch;  // 1 + 3
        union {
        	// 4
            float f;
            int i;
        };
    };
    
    // 当类型里嵌套类型的时候,内部类型和外部类型没有关系,只是在设计的时候采用这种方案
    // 可以通过外部类型的变量访问内部类型的变量,但是从内存角度而言这个内部变量并不属于外部变量
    struct data2 {
    	//data2只有1个成员 
        char ch;
        union udata{
            float f;
            int i;
        };
    };
    
    int main() {
        printf("%ld\n", sizeof(struct data1)); // 8
        printf("%ld\n", sizeof(struct data2)); // 1
        struct data2 x;
        x.udata = 12; // 这句报错,无法直接访问
        union data2::udata xx; // 通过作用域定义
        return 0;
    }
    
    union IPNode {
        unsigned int addr;
        char s3, s2, s1, s0;
    };
    
    int main() {
        union IPNode x;
        x.addr = 0x61626364;
        char ch = x.s0;
        printf("%x\n", ch); // 64
        ch = x.s1;
        printf("%x\n", ch); // 64
        ch = x.s2;
        printf("%x\n", ch); // 64
        ch = x.s3;
        printf("%x\n", ch); // 64
        return 0;
    }
    

    在这里插入图片描述
    注:写成数组的形式,使得内存连续分配,才可得到64、63、62、61

    char* getString() {
        char str[] = { "hello" };
        return str;
    }
    
    int main() {
        char* str = getString();   // 函数执行完成后,数组str被销毁,str成为失效指针,地址可访问
        printf(str);               // 打印随机值
        strcpy_s(str, 10, "hello"); // 一般而言,str指向空间失效,但是地址有效,应该是可以赋值
        printf(str);               
        free(str);                  // 只有根据malloc的头尾信息进行free
        return 0;
    }
    
    char* getString() {
        char* str = "hello"; // 分配至全局区,而不在栈区
        return str;
    }
    
    int main() {
        char* str = getString();   // 函数执行完成后,全局区的"hello"不会被销毁
        printf(str);                //打印hello
        strcpy_s(str, 10, "hello"); // 无法赋值,字符串常量可读不可写        
        return 0;
    }
    
    int main() {
        int* p = (int*)malloc(sizeof(int));
        *p = 100;
        printf("%d\n", *p); // 正常打印
        free(p);            //free后变成失效指针,将已用标记改成未用标记,但是地址依然有效(野指针的地址无效)
        // 失效指针地址有效,不为0
        if (NULL != p) {
            printf("%d\n", *p);  // 随机值
            *p = 200;            // 正常赋值
            printf("%d\n", *p);  // 正常打印
        }
        free(p);         // 重复free,报错
        return 0;
    }
    
    int main() {
        int* p = (int*)malloc(sizeof(int));
        int* s = NULL;
        *p = 100;
        printf("%d\n", *p);
        free(p);                            // 从堆区释放内存,地址还存在,只是存放的数据变成了随机值
    
        s = (int*)malloc(sizeof(int));      // 这里申请的是和p一样的地址
        *s = 200;        
        printf("%d\n", *p);                 //正常打印
        free(p);                            // 通过p把s释放,因为p和s的地址相同
        free(s);                            // 同一地址重复释放,报错
        return 0;
    }
    

    野指针就是不知道指向哪里,或者说不知道指向的内存是否可以使用,一般都是刚刚声明但没有初始化的指针。空指针不是指向常数0,只指向地址0,即NULL,其实换句话说,指针的本质就是地址嘛,空指针就是指针本身的值(地址)为0空指针的作用是防止野指针的出现,因为我们不能知道野指针到底指向哪里,所以我们也无法判断一个指针是否是野指针,这样很危险,但如果养成将指针初始化为空指针的习惯,我们就能判断出这个指针是不是有效的

    union B {
        unsigned int a;
        unsigned char b[4];
    }g;
    
    int main() {
        g.b[1] = 1;
        printf("%d, %d\n", sizeof(union B), g.a);//4, 256
        return 0;
    }
    

    在这里插入图片描述

    int get_sys_mode1() {
        union{
            unsigned int a;
            unsigned char b[4];
        }g;
        g.a = 1;
        return g.b[3] == 1;// b[3]是高地址,1是低位
    }
    
    int get_sys_mode2() {
        int a = 1;
        int* p = &a;
        return (*(char*)p) == 0;
    }
    

    在这里插入图片描述

    展开全文
  • 联合体union笔记

    2020-09-29 14:34:31
    联合体union 当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。 1)联合体是一个结构; 2)它的所有成员相对于基地址的偏移量都为0; 3)此结构空间要大到足够容纳最"宽"的成员; 4)其对齐...

    联合体union

    当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。

    1)联合体是一个结构;

    2)它的所有成员相对于基地址的偏移量都为0;

    3)此结构空间要大到足够容纳最"宽"的成员;

    4)其对齐方式要适合其中所有的成员;

    下面解释这四条描述:

    由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0,即所有成员的首地址都是一样的。为了使得所有成员能够共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合其中所有的成员”是指其必须符合所有成员的自身对齐方式。

    例:
    union haxi
    {
    	my_type a = 'a' ;
    	my_type b ;
    	my_type c ;
    	int d;
    };
    	haxi aha;
    	aha.a = 'a';
    	aha.b = 'b';
    	aha.c = 'c';
    	aha.a = 'd';
    	aha.d = 1;
    	cout << sizeof(aha) << endl;
    	printf("a: %d\n", aha.a);
    	printf("a: %d, b:%d , c: %d\n", aha.a, aha.b, aha.c);
    	printf("d: %d\n", aha.d);
    
    输出:
    4
    a: 1
    a: 1, b:1 , c: 1
    d: 1
    
    

    改变其中一个的值,调用其余的值的时候输出都是被改变的值,且初始化的时候只能给一个属性赋值。

    展开全文
  • C语言中的联合体是有固定存放顺序的,一定是低位存放在低地址,高位存放在高地址,这是很多开发者尤其是PC平台的开发者很容易忽视的一个特性。我们知道,计算机平台有一个大小端的区别,小端系统中数据低位存放在低...

    C语言中的联合体是有固定存放顺序的,一定是低位存放在低地址,高位存放在高地址,这是很多开发者尤其是PC平台的开发者很容易忽视的一个特性。

    我们知道,计算机平台有一个大小端的区别,小端系统中数据低位存放在低地址,大端系统中数据则低位存放在高地址。比如一个双字节整数,分配的地址是0x4A00和0x4A01两个字节,要存储1这个数字的时候,小端系统中0x4A00存放0,0x4A01存放1,大端系统中0x4A00存放1,0x4A01存放0。

    可以看到,在小端系统中,联合体的存放顺序和系统是一致的,但到了大端系统,就和系统相反了。如果你习惯于使用小端系统,直接用类型变量代替联合体不会出现问题,但在大端系统中却会出现错误,甚至程序崩溃。因此对联合体的运用,最保险的办法是严格定义联合体变量,而不是贪图方便,直接用基本类型变量代替,这样当跨平台时才能尽量避免错误。

    比如以下的代码,在x86、mips上都是没问题的:

    semctl(id, 0, SETVAL, 1);

    但是在PowerPC上,这语句就会导致错误,因此应该写成这样:

    union semun un;

    un.val = 1;

    semctl(id, 0, SETVAL, un);

    

    展开全文
  • 联合体union、枚举enum

    2018-08-06 21:05:56
    当需要把不同类型的变量存放到同一段内存单元,或对同 一段内存单元的数据按不同类型处理,则需要使用“联合 体”数据结构。 union 主要用来压缩空间。如果一些数据不可能在同一时 间同时被用到,则可以使用...

    1、什么是联合体?

    当需要把不同类型的变量存放到同一段内存单元,或对同

    一段内存单元的数据按不同类型处理,则需要使用联合

    数据结构

    union 主要用来压缩空间。如果一些数据不可能在同一时

    间同时被用到,则可以使用union

     

    2、 联合体的定义

    把一个整型变量、一个字符型变量、一个实型变

    量放在同一个地址开始的内存单元中

    union   data{

          int i;

           char  ch;

          float  f;

    }

     

    联合体各成员有相同的起始地址,联合体变量所占内存等于最长的成员所占内存

    结构体各成员有不同的起始地址,结构体变量所占内存长度等于全部成员所占内存之和

     

     

     

     

     

     

    展开全文
  • c++中的联合体 union

    2016-12-23 22:01:09
    本文转自巫祝的微博,解释了union联合体及它的用法
  • C语言联合体union

    2010-09-13 19:56:00
    C语言中的联合体union在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也...
  • C/C++语言中联合体union的妙用

    千次阅读 2019-01-16 14:52:47
    联合体union的基本概念 在C/C++语言中,有时需要在同一段内存单元中存放不同类型的变量,如把一个整形变量int、一个字符型变量char和一个双精度实型变量double放在同一个地址开始的内存单元中,这3个变量虽然在内存...
  • 联合体(union)在C语言中是一个特殊的数据类型,能够存储不同类型的数据在同一个内存位置。可以定义一个联合体使用许多成员,但只有一个部件可以包含在任何时候给定的值。联合体会提供使用相同的存储器位置供多用途的...
  • C++联合体union用法实例详解

    万次阅读 2018-02-13 12:39:42
    转载自:http://www.jb51.net/article/66711.htm本文实例讲述了C++联合体union用法。分享给大家供大家参考。具体如下:我们应该按照C中的convention去使用union,这是我这篇文章要给出的观点。虽然C++使得我们可以...
  • c++中的联合体Union

    2018-09-07 21:36:50
     共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。union变量所...
  • C语言中联合体union的使用

    热门讨论 2016-12-18 19:56:11
     联合体union和结构体struct有一些相似之处,但两者本质上不同,在结构体中,各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和。而在联合体中,各成员共享一段内存空间,一个联合变量的长度等于各...
  • 联合体union用在何处?

    千次阅读 2015-07-06 11:14:01
     一番感慨之后,还是给出为主题“联合体union用在何处”要给出的案例。下面的内容部分转载自 点击打开… 。积累下去,应用场合绝不止这些   试题一  编写一段程序判断系统中的CPU 是Little endian 还是...
  • C语言之联合体union

    2014-03-31 23:26:01
     有时需要使几种不同类型的变量存放到同一段内存单元中,也就是用覆盖技术,几个变量互相覆盖。这种几个不同的变量共占同一段内在的结构称为 共用体 类型的结构。 定义共用体类型的一般形式为 union 共用体名 { ...
  • C语言中的联合体union

    2011-11-23 22:51:25
    在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个...]union myun { struct { int x; int y; int z; }u; int k; }a; int mai...
  • 今天休息,本不打算写文章,一个... 1、 联合体union定义:  当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的:  1)联合体是
  • 1. 联合体union的特征及应用 1.1. 特征 1.2. 特征 2. 使用union进行串口/UDP等数据传输 2.1. 用union定义传输协议 2.2. 赋值&amp;amp;amp;发送 2.3. 接收&amp;amp;amp;解析 1. 联合体union的特征...
  • 联合体union的用法

    千次阅读 2011-08-13 15:16:10
    http://blog.chinaunix.net/space.php?uid=8867796&do=blog&cuid=1829958   在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物
  • 联合体存放顺序问题

    千次阅读 2017-06-30 17:53:18
    C语言中的联合体是有固定存放顺序的,一定是从低地址开始存放数据,在小端系统中,和系统是一致的,但到了大端系统,就和系统相反了。因此对联合体的运用,最保险的办法是严格定义联合体变量,而不是贪图方便,直接...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,824
精华内容 3,529
关键字:

联合体union存放