MST

星途 面试题库

面试题:C语言指针访问结构体和联合体区别之基础应用

请定义一个结构体 `struct student`,包含 `int id`、`char name[20]` 成员,以及一个联合体 `union score`,包含 `float math`、`float english` 成员。然后使用指针分别访问结构体和联合体的成员,并编写代码打印出结构体的 `id` 和联合体的 `math` 成员值。阐述在这个过程中,指针访问结构体和联合体成员在语法和内存布局理解上有何不同。
43.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 定义结构体
struct student {
    int id;
    char name[20];
    union score {
        float math;
        float english;
    } s;
};

int main() {
    struct student stu = {1, "Tom", {90.5}};
    struct student *stuPtr = &stu;
    // 使用指针访问结构体和联合体成员并打印
    printf("id: %d\n", stuPtr->id);
    printf("math: %f\n", stuPtr->s.math);
    return 0;
}

指针访问结构体和联合体成员的不同

  1. 语法层面
    • 结构体:使用 -> 操作符,例如 stuPtr->id-> 左边是结构体指针,右边是结构体成员名。这是因为结构体指针指向结构体整体,通过 -> 操作符可以访问结构体内部的成员。
    • 联合体:由于联合体是结构体的一种特殊形式,在结构体内部访问联合体成员时,同样使用 -> 操作符,如 stuPtr->s.math。先通过结构体指针访问到联合体成员 s,再通过 . 操作符访问联合体内部的具体成员 math(这里 s 是联合体类型的成员,不是指针,所以用 .)。
  2. 内存布局层面
    • 结构体:结构体的成员在内存中是顺序存储的。在上述 struct student 中,id 先占用 4 个字节(假设 int 为 4 字节),然后是 name 数组占用 20 个字节,最后是 union score 占用 4 个字节(假设 float 为 4 字节)。结构体的大小是其所有成员大小之和(考虑内存对齐)。
    • 联合体:联合体所有成员共享同一块内存空间,其大小为联合体中最大成员的大小。在 union score 中,mathenglish 共享 4 个字节的内存空间,同一时间只有一个成员有效。 所以在通过指针访问联合体成员时,要清楚当前有效的是哪个成员。