MST
星途 面试题库

面试题:C语言中复杂结构体嵌套下malloc动态内存分配与管理

假设有如下结构体定义:struct Inner { int data1; char data2[10]; }; struct Outer { struct Inner inner; double num; char *str; }; 请编写代码,使用malloc为Outer结构体动态分配内存,对各个成员正确赋值(对于str成员,动态分配长度为20的内存并赋值字符串),并确保内存分配成功时所有操作正确,最后妥善释放所有动态分配的内存,包括嵌套结构体中的内存。描述在这个过程中需要注意的内存管理细节。
38.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

int main() {
    // 1. 使用malloc为Outer结构体动态分配内存
    struct Outer *outer = (struct Outer *)malloc(sizeof(struct Outer));
    if (outer == NULL) {
        perror("malloc for outer");
        return 1;
    }

    // 2. 对Inner结构体成员赋值
    outer->inner.data1 = 42;
    strcpy(outer->inner.data2, "Hello");

    // 3. 对double成员赋值
    outer->num = 3.14;

    // 4. 为str成员动态分配内存并赋值字符串
    outer->str = (char *)malloc(20 * sizeof(char));
    if (outer->str == NULL) {
        perror("malloc for str");
        free(outer); // 释放已分配的outer内存
        return 1;
    }
    strcpy(outer->str, "This is a test string");

    // 使用结构体成员
    printf("data1: %d\n", outer->inner.data1);
    printf("data2: %s\n", outer->inner.data2);
    printf("num: %lf\n", outer->num);
    printf("str: %s\n", outer->str);

    // 5. 释放内存
    free(outer->str);
    free(outer);

    return 0;
}

内存管理细节注意事项:

  1. 分配内存
    • 使用malloc分配内存时,要检查返回值是否为NULL,以确保内存分配成功。如果内存分配失败,程序应妥善处理,例如打印错误信息并退出。
    • 对于嵌套结构体Inner,不需要单独为其分配内存,因为Outer结构体的内存空间已经包含了Inner结构体的空间。
  2. 释放内存
    • 释放内存的顺序很重要,先释放outer->str指向的内存,因为它是单独分配的,然后再释放outer指向的内存。如果顺序颠倒,会导致内存泄漏,因为outer指向的内存一旦释放,outer->str就成为野指针,无法再安全释放其指向的内存。
    • 确保在程序结束前释放所有动态分配的内存,避免内存泄漏。在出现错误提前退出程序时,也要确保已分配的内存被正确释放。