当前位置: 首页 > java >正文

C语言高频面试题——结构体和联合体区别

在 C 语言中,结构体(struct)联合体(union) 是两种重要的复合数据类型,用于组织和管理多个相关的变量。尽管它们在语法上有些相似,但在内存布局、用途和行为上有显著的区别。以下是详细的对比分析:


1. 定义与本质

结构体(struct
  • 定义
    • 结构体是一种用户自定义的数据类型,允许将不同类型的数据组合在一起。
    • 每个成员变量都有独立的存储空间。
  • 声明语法
    struct StructName {type1 member1;type2 member2;...
    };
    
  • 核心特点
    • 每个成员都分配独立的内存空间。
    • 总大小等于所有成员的大小之和(考虑对齐规则)。
联合体(union
  • 定义
    • 联合体也是一种用户自定义的数据类型,但所有成员共享同一块内存。
    • 同一时间只能存储一个成员的值。
  • 声明语法
    union UnionName {type1 member1;type2 member2;...
    };
    
  • 核心特点
    • 所有成员共享同一块内存区域。
    • 总大小等于最大成员的大小(考虑对齐规则)。

2. 内存布局

结构体
  • 内存分配
    • 每个成员占用独立的内存空间。
    • 编译器会根据对齐规则插入填充字节以优化访问效率。
  • 示例
    struct Example {char a;    // 1字节int b;     // 4字节
    };
    
    • 内存布局(假设 4 字节对齐):
      | char a (1字节) | 填充3字节 | int b (4字节) |
      
    • 总大小:8 字节。
联合体
  • 内存分配
    • 所有成员共享同一块内存区域。
    • 总大小等于最大成员的大小。
  • 示例
    union Example {char a;    // 1字节int b;     // 4字节
    };
    
    • 内存布局:
      | 共享区域 (4字节) |
      
    • 总大小:4 字节。

3. 使用场景

结构体
  • 适用场景
    • 需要同时存储多个不同类型的值。
    • 数据之间的关系是并列的(例如学生信息:姓名、年龄、成绩)。
  • 示例
    struct Student {char name[20];int age;float score;
    };
    
联合体
  • 适用场景
    • 需要在同一块内存中存储不同的值(互斥使用)。
    • 节省内存空间,尤其是当只需要存储其中一个成员时。
  • 示例
    union Data {int i;float f;char c;
    };
    

4. 行为差异

结构体
  • 成员独立性
    • 每个成员可以同时存在,并且互不影响。
    • 修改一个成员不会影响其他成员。
  • 示例
    struct Example {int x;int y;
    } s;
    s.x = 10;
    s.y = 20;
    printf("%d %d", s.x, s.y); // 输出 10 20
    
联合体
  • 成员共享性
    • 所有成员共享同一块内存,修改一个成员会影响其他成员。
    • 当前有效值取决于最后赋值的成员。
  • 示例
    union Example {int x;char y;
    } u;
    u.x = 65; // ASCII值 'A'
    printf("%d\n", u.x); // 输出 65
    printf("%c\n", u.y); // 输出 'A'(共享内存)
    

5. 大小计算

结构体
  • 总大小
    • 等于所有成员的大小之和(考虑对齐规则)。
  • 示例
    struct Example {char a;    // 1字节double b;  // 8字节
    };
    
    • 内存布局(假设 8 字节对齐):
      | char a (1字节) | 填充7字节 | double b (8字节) |
      
    • 总大小:16 字节。
联合体
  • 总大小
    • 等于最大成员的大小(考虑对齐规则)。
  • 示例
    union Example {char a;    // 1字节double b;  // 8字节
    };
    
    • 内存布局:
      | 共享区域 (8字节) |
      
    • 总大小:8 字节。

6. 初始化与赋值

结构体
  • 初始化
    • 可以逐个成员初始化。
    • 示例:
      struct Example {int x;char y;
      } s = {10, 'A'};
      
联合体
  • 初始化
    • 只能初始化第一个成员。
    • 示例:
      union Example {int x;char y;
      } u = {65}; // 初始化 x
      

7. 总结

特性结构体 (struct)联合体 (union)
内存分配每个成员独立分配所有成员共享同一块内存
总大小成员大小之和(考虑对齐规则)最大成员的大小(考虑对齐规则)
成员独立性成员互不影响成员共享内存,修改一个会影响其他成员
适用场景存储多个相关变量节省内存,互斥使用

总结一句话

  • 结构体:适合存储多个独立的变量。
  • 联合体:适合在同一块内存中存储互斥的变量,节省空间。

理解两者的区别可以帮助你根据实际需求选择合适的数据结构!

http://www.xdnf.cn/news/1070.html

相关文章:

  • Selenium+Java 环境搭建
  • Redis
  • 使用python调用deepseek 多轮对话,详细讲解
  • start_response详解
  • 无线定位技术中的 IQ 采样:深度解析与实战指南
  • 辛格迪客户案例 | 苏州富士莱医药GMP培训管理(TMS)项目
  • 测试基础笔记第八天
  • Fortran中FORALL的用法与性能分析
  • Android 图片加载框架 Glide 详细介绍
  • ros2 humble moveit调试笔记
  • c语言之fprintf函数和ftell的使用
  • 基于 Vue,使用Vuex 或事件总线实现跨组件通信
  • 高并发场景下的淘宝 API 开发实践:商品数据实时采集与性能优化
  • 迅为RK3568开发板内核模块实现-设置交叉编译器
  • 基于mybatis与PageHelper插件实现条件分页查询(3.19)
  • Linux学习笔记|入门指令
  • 维度建模工具箱 提纲与总结
  • #Paper Reading# DeepSeek-V3
  • docker部署seata
  • Nebula图数据库
  • STM32H5开发陀螺仪LSM6DSV16X(1)----轮询获取陀螺仪数据
  • 【leetcode题解】滑动窗口
  • 【瑞萨RA4L1-SENSOR套件测评】LCD 显示
  • 2025年pta团队设计天梯赛题解
  • FreeRTOS互斥信号量解决优先级翻转实战教程
  • docker 中将dpo后的模型转为ollama能够调用的gguf格式
  • 通过Docker Desktop配置OpenGauss数据库的方法(详细版+图文结合)
  • 助conda命令把环境导出为一个文件,然后在 Linux 系统里利用该文件重新创建相同的环境
  • mapbox进阶,实现掩膜效果,并控制掩膜透明度
  • 数组的应用