面试题答案
一键面试- 内存布局差异:
- 结构体:结构体的各个成员按照声明顺序依次存储在内存中,内存大小是所有成员大小之和(考虑内存对齐)。例如,一个结构体包含一个
char
(1字节)、一个int
(假设4字节,在32位系统),如果没有内存对齐,理论大小是5字节,但由于内存对齐,实际大小可能是8字节(char
占1字节,填充3字节,int
占4字节)。 - 联合体:联合体所有成员共享同一块内存空间,其大小取决于最大成员的大小。例如,一个联合体包含一个
char
(1字节)和一个int
(4字节),联合体大小就是4字节。
- 结构体:结构体的各个成员按照声明顺序依次存储在内存中,内存大小是所有成员大小之和(考虑内存对齐)。例如,一个结构体包含一个
- 代码示例:
#include <stdio.h>
#include <stdint.h>
// 结构体定义
typedef struct {
char a;
int b;
} StructExample;
// 联合体定义
typedef union {
char a;
int b;
} UnionExample;
int main() {
StructExample struct_obj;
UnionExample union_obj;
printf("Size of StructExample: %zu bytes\n", sizeof(struct_obj));
printf("Size of UnionExample: %zu bytes\n", sizeof(union_obj));
// 结构体成员赋值与访问
struct_obj.a = 'A';
struct_obj.b = 100;
printf("Struct: a = %c, b = %d\n", struct_obj.a, struct_obj.b);
// 联合体成员赋值与访问
union_obj.a = 'B';
printf("Union: a = %c\n", union_obj.a);
union_obj.b = 200;
printf("Union: b = %d\n", union_obj.b);
printf("Union: a (after setting b) = %c\n", union_obj.a);
return 0;
}
在上述代码中,StructExample
结构体的大小可以看到是sizeof(char)+填充字节+sizeof(int)
,而UnionExample
联合体的大小是sizeof(int)
,因为int
是联合体中最大的成员。同时,通过对联合体不同成员的赋值和访问,可以看到它们共享同一块内存,后赋值的成员会覆盖之前的值。