Chinaunix首页 | 论坛 | 博客
  • 博客访问: 872128
  • 博文数量: 151
  • 博客积分: 3477
  • 博客等级: 中校
  • 技术积分: 1464
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-30 21:53
文章分类

全部博文(151)

文章存档

2026年(4)

2025年(10)

2024年(8)

2023年(10)

2022年(4)

2021年(10)

2020年(9)

2018年(1)

2017年(1)

2014年(4)

2013年(3)

2012年(12)

2011年(24)

2010年(2)

2009年(8)

2008年(6)

2007年(34)

2006年(1)

分类: C/C++

2025-05-28 17:10:28

简单说,两者其实很像。
只说不同点。

1、两者占用的内存空间不同。

点击(此处)折叠或打开

  1. struct _student {
  2.     int student_id ;
  3.     char student_name[64];
  4. }
这个结构体定义占用的空间大小是:68 字节,也就是一个整型的占 4 字节,加上 char student[64]占用的 64 字节。

点击(此处)折叠或打开

  1. union _student {
  2.     int student_id ;
  3.     char student_name[64];
  4. }
这个联合体定义占用的空间大小是:64字节,也就是这个联合体中的{BANNED}最佳大的变量定义所占用的字节数。

2、使用方式不同。
这里我借用一段别人的代码来进行解释和说明。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. // 定义结构体
  4. typedef struct {
  5.     char name[50];
  6.     int age; float gpa;
  7. } Student;

  8. // 定义联合体
  9. typedef union {
  10.     int i; float f;
  11.     char str[20];
  12. } Data;

  13. int main()
  14. {
  15. // 使用结构体
  16.     Student student = {"Alice", 20, 3.5};
  17.     printf("Student Name: %s\n", student.name);
  18.     printf("Student Age: %d\n", student.age);
  19.     printf("Student GPA: %.2f\n", student.gpa);
  20.     
  21.     // 使用联合体
  22.     Data data;
  23.     data.i = 42;
  24.     printf("Union as int: %d\n", data.i);
  25.     data.f = 3.14;
  26.     printf("Union as float: %.2f\n", data.f);
  27.     strcpy(data.str, "Hello");
  28.     printf("Union as string: %s\n", data.str);
  29.     // 注意:以下访问可能导致未定义行为,因为此时联合体中的有效成员是str
  30.     // printf("Union as int after setting string: %d\n", data.i);
  31.     // 不建议这样做
  32.     return 0;
  33. }
我们仔细分析这段代码,会发现:
对于结构体而言,其中间定义的元素都独立占有各自的空间,在任何时候都可以独立访问其中的任何一个定义的元素。
对于联合体而言,在特定的时间,只能访问其中的一个定义的元素,如果我们对其中的某个元素赋值操作了,那么在没有对其他的元素进行赋值操作前,这个结构体的内存区间被当前这个已经被赋值的元素所独享,当再次对结构体中的其他的元素赋值时,原来的那个元素的内容将会被丢失而变得不可访问。

总结:
结构体中的每个元素占有独立的内存空间,而联合体中的每个元素不占有独立的内存空间,联合体中的元素共享一个内存空间,在特定的时间段内,只能对联合体内的某个{BANNED}最佳近赋值的的元素进行访问。
一般而言,联合体占用的内存空间少,而结构体占用的内存空间大。
从访问效率上来说,结构体的效率要远高于联合体。




阅读(32) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~