union 以及sizeof

    xiaoxiao2021-04-14  38

    在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。

    #include <stdio.h> void main() { union number { /*定义一个联合*/ int i; struct { /*在联合中定义一个结构*/ char first; char second; }half; }num; num.i=0x4241; /*联合成员赋值*/ printf("%x%x/n", num.half.first, num.half.second); num.half.first='a'; /*联合中结构成员赋值*/ num.half.second='b'; printf("%x/n", num.i); printf("")

    getchar(); } 输出结果为:  4142 6261

    4

    从上例结果可以看出: 当给i赋值后, 其低八位也就是first和second的值; 当给first和second赋字符后, 这两个字符的ASCII码也将作为i 的低八位和高八位。如下图。在内存中,高位放在地址大的地方。对于0x4241在内存中,地址从小到大的4个字节,依次存储0x41 0x42

    1、联合里面那些东西不能存放? 我们知道,联合里面的东西共享内存,所以静态、引用 类 都不能用,因为他们不可能共享内存。

    类不可以放入联合吗

    我们先看一个例子: class Test { public: Test():data(0) { } private: int data; }; typedef union _test { Test test;  }UI;  编译通不过,为什么呢? 因为联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。

    转载请注明原文地址: https://ju.6miu.com/read-669699.html

    最新回复(0)