MST

星途 面试题库

面试题:C语言联合体的内存分配与数据访问

假设有如下联合体定义:union Data { int num; char ch; float f; }; 请分析在32位系统下,这个联合体占用多少字节内存,并说明当对联合体的不同成员赋值后,如何正确访问其中的数据,同时解释原因。
24.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 联合体占用字节数
    • 在32位系统下,int通常占4字节,char占1字节,float占4字节。
    • 联合体的大小取决于其最大成员的大小。所以union Data占用4字节内存。
  2. 对不同成员赋值后访问数据
    • 当对联合体的一个成员赋值后,访问另一个成员时,需要注意联合体成员共享同一块内存。
    • 例如:
    #include <stdio.h>
    union Data {
        int num;
        char ch;
        float f;
    };
    int main() {
        union Data data;
        data.num = 10;
        printf("data.num: %d\n", data.num);
        // 如果此时访问data.ch,它会读取num的第一个字节(因为内存共享)
        printf("data.ch: %c\n", data.ch);
        data.f = 3.14f;
        printf("data.f: %f\n", data.f);
        // 此时data.num和data.ch的值已经被覆盖,因为它们共享同一块内存
        // 如果再访问data.num或data.ch,得到的值是无意义的,因为内存已经被float数据覆盖
        return 0;
    }
    
    • 原因:联合体的所有成员在内存中从同一个地址开始存储,它们共享同一块内存空间。当对一个成员赋值时,会覆盖其他成员在内存中的值。所以在访问联合体成员时,要确保访问的是最近赋值的成员,否则可能得到错误或无意义的数据。