MST

星途 面试题库

面试题:C语言联合体内存共享的深入理解

假设有一个联合体,包含一个结构体成员,结构体中有两个短整型(short)成员,以及一个整型成员。编写代码初始化联合体,使得结构体中的两个短整型成员分别为100和200,然后通过整型成员读取联合体的值,并解释该值是如何得到的,同时说明联合体内存对齐对这个过程的影响。
31.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 定义联合体
union MyUnion {
    struct {
        short num1;
        short num2;
    } myStruct;
    int num;
};

int main() {
    union MyUnion u;
    // 初始化结构体成员
    u.myStruct.num1 = 100;
    u.myStruct.num2 = 200;

    // 通过整型成员读取联合体的值
    printf("通过整型成员读取的值: %d\n", u.num);

    return 0;
}

结果解释

联合体所有成员共享同一块内存空间。在这个联合体中,myStruct的两个short成员共占用4个字节(假设short是2字节),num也是4字节。当myStruct.num1被赋值为100,myStruct.num2被赋值为200时,内存布局如下(假设小端序):

+-----+-----+-----+-----+
| 100 | 200 |  0  |  0  |
+-----+-----+-----+-----+

当通过num读取时,由于num占用4个字节,会把这4个字节按整数解析,所以值为100 + 200 * 2^16(在小端序系统中)。

内存对齐影响

联合体的大小是其最大成员的大小,在这个例子中是int的大小,通常为4字节。结构体myStruct中两个short成员总共也是4字节,满足内存对齐要求。如果myStruct中有其他成员导致其大小超过int,联合体大小会相应调整以满足最大成员的对齐要求。同时,在不同的系统(如大端序或小端序)中,通过num读取的值会因为字节序不同而不同。