MST

星途 面试题库

面试题:C语言中结构体与联合体内存布局差异基础

请详细阐述C语言中结构体和联合体在内存布局上的主要差异,并通过一段简单代码示例分别展示结构体和联合体的内存分配情况,代码需能清晰体现这种差异。
17.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 内存布局差异
    • 结构体:结构体的各个成员按照声明顺序依次存储在内存中,内存大小是所有成员大小之和(考虑内存对齐)。例如,一个结构体包含一个char(1字节)、一个int(假设4字节,在32位系统),如果没有内存对齐,理论大小是5字节,但由于内存对齐,实际大小可能是8字节(char占1字节,填充3字节,int占4字节)。
    • 联合体:联合体所有成员共享同一块内存空间,其大小取决于最大成员的大小。例如,一个联合体包含一个char(1字节)和一个int(4字节),联合体大小就是4字节。
  2. 代码示例
#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是联合体中最大的成员。同时,通过对联合体不同成员的赋值和访问,可以看到它们共享同一块内存,后赋值的成员会覆盖之前的值。