4453: 【例】结构体(struct)和联合体(union)区别

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:4 解决:3

题目描述

在 struct 中,每个成员都有自己的内存空间,在 union 中,所有成员共享同一块内存空间,union 的大小取决于其最大的成员

struct 中的成员可以同时存在,每个成员都有自己的地址,union 中的成员共享相同的内存,同一时刻只能存储一个成员的值

struct 的大小等于其所有成员大小的总和,每个成员都有独立的内存空间,union 的大小等于其最大成员的大小,各变量共享内存

样例输入 复制


样例输出 复制


提示

#include <iostream>
using namespace std;
/*
  定义结构体 MyStruct
  内包括3个变量,这3个变量被组织到一起,可以同时使用 
*/ 
struct MyStruct {//占用空间必须是最大占用空间变量的整数倍 
//i 占用4个字节 需要补4个字节够8个字节,因为后面够8个字节 (8) 
    int i;
//d 占用8个字节 (8) 
    double d;
//c 占用1个字节 需要补7个字节到8个字节 (8) 
    char c;
};//所以 MyStruct总共占用24个字节 

struct MyStruct1 {//占用空间必须是最大占用空间变量的整数倍 
//i 占用4个字节 需要补4个字节够8个字节,因为后面够8个字节 (8) 
	int i;
//d 占用8个字节  (8) 
    double d;
//用4个字节 和后面c一起补足8个字节 (j,c一起再补足3个字节)  (8) 
    int j;
//c 占用1个字节 
    char c;
};//所以 MyStruct1总共占用24个字节

struct MyStruct2 {//占用空间必须是最大占用空间变量的整数倍
//i 占用4个字节 需要补4个字节够8个字节,因为后面够8个字节 (8) 
    int i; 
//d 占用8个字节  (8)
    double d;
//j用4个字节 补足8个字节  (8) 
    int j;
//d1 占用8个字节  (8)
    double d1;
//c 占用1个字节 补足8个字节  (8)  
    char c;
};//所以 MyStruct1总共占用40个字节

/*
  定义一个联合体 MyUnion
  内包括3个不同类型变量 这3个变量同时只能使用一个 
  占用空间,联合体变量占用空间最大的变量 
*/ 
union MyUnion {
    int i;//i占用4个字节 
    double d;//d占用8个字节 
    char c;//c占用1个字节 
};//联合体占用空间为8个字节 

int main() {
    cout << "struct占用内存空间大小:" << sizeof(MyStruct) << " bytes" << endl;
    cout << "struct1占用内存空间大小:" << sizeof(MyStruct1) << " bytes" << endl;
    cout << "struct2占用内存空间大小:" << sizeof(MyStruct2) << " bytes" << endl;
    cout << "union占用内存空间大小:" << sizeof(MyUnion) << " bytes" << endl;
	
    MyStruct s;
    s.i = 42;
    s.d = 3.14;
    s.c = 'A';

    cout << "Struct的值: " << s.i << ", " << s.d << ", " << s.c << endl;

    MyUnion u;
    u.i = 42;
    cout << "联合体i的值: " << u.i << endl;

    u.d = 3.14;
    cout << "联合体重新赋值后d的值: " << u.d << endl;

    return 0;
}