简单说,两者其实很像。
只说不同点。
1、两者占用的内存空间不同。
-
struct _student {
-
int student_id ;
-
char student_name[64];
-
}
这个结构体定义占用的空间大小是:68 字节,也就是一个整型的占 4 字节,加上 char student[64]占用的 64 字节。
-
union _student {
-
int student_id ;
-
char student_name[64];
-
}
这个联合体定义占用的空间大小是:64字节,也就是这个联合体中的{BANNED}最佳大的变量定义所占用的字节数。
2、使用方式不同。
这里我借用一段别人的代码来进行解释和说明。
-
#include <stdio.h>
-
#include <string.h>
-
// 定义结构体
-
typedef struct {
-
char name[50];
-
int age; float gpa;
-
} Student;
-
-
// 定义联合体
-
typedef union {
-
int i; float f;
-
char str[20];
-
} Data;
-
-
int main()
-
{
-
// 使用结构体
-
Student student = {"Alice", 20, 3.5};
-
printf("Student Name: %s\n", student.name);
-
printf("Student Age: %d\n", student.age);
-
printf("Student GPA: %.2f\n", student.gpa);
-
-
// 使用联合体
-
Data data;
-
data.i = 42;
-
printf("Union as int: %d\n", data.i);
-
data.f = 3.14;
-
printf("Union as float: %.2f\n", data.f);
-
strcpy(data.str, "Hello");
-
printf("Union as string: %s\n", data.str);
-
// 注意:以下访问可能导致未定义行为,因为此时联合体中的有效成员是str
-
// printf("Union as int after setting string: %d\n", data.i);
-
// 不建议这样做
-
return 0;
-
}
我们仔细分析这段代码,会发现:
对于结构体而言,其中间定义的元素都独立占有各自的空间,在任何时候都可以独立访问其中的任何一个定义的元素。
对于联合体而言,在特定的时间,只能访问其中的一个定义的元素,如果我们对其中的某个元素赋值操作了,那么在没有对其他的元素进行赋值操作前,这个结构体的内存区间被当前这个已经被赋值的元素所独享,当再次对结构体中的其他的元素赋值时,原来的那个元素的内容将会被丢失而变得不可访问。
总结:
结构体中的每个元素占有独立的内存空间,而联合体中的每个元素不占有独立的内存空间,联合体中的元素共享一个内存空间,在特定的时间段内,只能对联合体内的某个{BANNED}最佳近赋值的的元素进行访问。
一般而言,联合体占用的内存空间少,而结构体占用的内存空间大。
从访问效率上来说,结构体的效率要远高于联合体。