MST

星途 面试题库

面试题:C语言结构体动态内存下的默认值初始化

假设有一个结构体,其中包含一个指向字符数组的指针成员,需要通过动态内存分配来为该字符数组分配空间。在初始化结构体时,不仅要为指针成员分配内存并设置一个默认字符串值,还要考虑内存管理,如防止内存泄漏。请设计这样一个结构体,并给出初始化、释放内存的完整代码,同时说明在不同的使用场景下(例如函数内部定义结构体和作为全局变量定义结构体),内存管理的差异和注意事项。
24.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

// 定义结构体
typedef struct {
    char *str;
} MyStruct;

// 初始化结构体
MyStruct* initMyStruct(const char *defaultStr) {
    MyStruct *obj = (MyStruct*)malloc(sizeof(MyStruct));
    if (obj == NULL) {
        return NULL;
    }
    obj->str = (char*)malloc(strlen(defaultStr) + 1);
    if (obj->str == NULL) {
        free(obj);
        return NULL;
    }
    strcpy(obj->str, defaultStr);
    return obj;
}

// 释放结构体内存
void freeMyStruct(MyStruct *obj) {
    if (obj != NULL) {
        if (obj->str != NULL) {
            free(obj->str);
        }
        free(obj);
    }
}
  1. 函数内部定义结构体
    • 内存管理差异:函数结束时,结构体变量本身会自动释放,但结构体中动态分配的内存(如obj->str)不会自动释放,需要手动调用freeMyStruct函数来释放,否则会造成内存泄漏。
    • 注意事项:确保在函数返回前或者在函数执行过程中可能出现的提前退出情况(如错误处理)下,都要调用freeMyStruct释放内存。
  2. 作为全局变量定义结构体
    • 内存管理差异:全局变量的生命周期贯穿整个程序运行过程,程序结束时系统会自动回收全局变量占用的内存空间,但同样,结构体中动态分配的内存(obj->str)不会自动释放。需要在合适的地方手动调用freeMyStruct函数释放内存,否则在程序运行过程中会一直占用内存,直到程序结束。
    • 注意事项:一般在程序退出前(如在main函数结束前)调用freeMyStruct来释放全局结构体中动态分配的内存。同时要注意,在多线程环境下,如果有多个线程可能访问该全局结构体,需要考虑线程安全问题,例如使用互斥锁来保护对结构体的操作,防止在释放内存时出现竞争条件。
int main() {
    // 函数内部定义结构体
    MyStruct *localObj = initMyStruct("Hello, local");
    if (localObj != NULL) {
        printf("Local struct str: %s\n", localObj->str);
        freeMyStruct(localObj);
    }

    // 全局变量模拟(这里使用静态变量模拟全局变量的生命周期)
    static MyStruct *globalObj = initMyStruct("Hello, global");
    if (globalObj != NULL) {
        printf("Global struct str: %s\n", globalObj->str);
        freeMyStruct(globalObj);
    }

    return 0;
}