MST

星途 面试题库

面试题:C语言结构体与联合体中的指针与嵌套

定义一个结构体 `Person`,包含姓名(字符数组)、年龄、一个指向另一个 `Person` 结构体的指针。再定义一个联合体 `Data`,它可以存储 `Person` 结构体或者一个浮点数。编写代码实现将一个 `Person` 对象存入 `Data` 联合体中,并正确读取其中的数据,同时要处理好内存管理问题,避免内存泄漏。
46.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义Person结构体
struct Person {
    char name[50];
    int age;
    struct Person* next;
};

// 定义Data联合体
union Data {
    struct Person person;
    float number;
};

int main() {
    // 分配内存给Person对象
    struct Person* newPerson = (struct Person*)malloc(sizeof(struct Person));
    if (newPerson == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return 1;
    }
    strcpy(newPerson->name, "张三");
    newPerson->age = 30;
    newPerson->next = NULL;

    // 将Person对象存入Data联合体
    union Data data;
    data.person = *newPerson;

    // 读取联合体中的数据
    printf("姓名: %s\n", data.person.name);
    printf("年龄: %d\n", data.person.age);
    printf("下一个Person指针: %p\n", (void*)data.person.next);

    // 释放内存,避免内存泄漏
    free(newPerson);

    return 0;
}

代码解释:

  1. 定义结构体和联合体:定义了 Person 结构体包含姓名、年龄和指向下一个 Person 的指针,以及 Data 联合体可以存储 Person 结构体或浮点数。
  2. 内存分配与初始化:在 main 函数中,使用 malloc 分配内存给 Person 对象,并进行初始化。
  3. 存入联合体:将 Person 对象存入 Data 联合体。
  4. 读取数据:从联合体中读取 Person 对象的数据并打印。
  5. 内存释放:使用 free 释放之前分配的 Person 对象的内存,避免内存泄漏。