MST
星途 面试题库

面试题:C语言中嵌套结构体使用malloc动态分配内存的复杂初始化问题

定义一个嵌套结构体如下: ```c struct Sub { int *arr; int size; }; struct Main { struct Sub sub1; struct Sub sub2; char *name; }; ``` 要求编写一个函数,使用`malloc`为`struct Main`类型的变量动态分配内存,其中`sub1`的`arr`分配包含5个元素的内存空间,并初始化为1到5,`sub1`的`size`设置为5;`sub2`的`arr`分配包含3个元素的内存空间,并初始化为3到5,`sub2`的`size`设置为3,`name`分配足够空间存储字符串"example",并完成初始化。最后编写一个释放函数,释放所有分配的内存。
39.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

// 分配内存的函数
struct Main* createMain() {
    struct Main* mainPtr = (struct Main*)malloc(sizeof(struct Main));
    if (mainPtr == NULL) {
        return NULL;
    }

    mainPtr->sub1.arr = (int*)malloc(5 * sizeof(int));
    if (mainPtr->sub1.arr == NULL) {
        free(mainPtr);
        return NULL;
    }
    for (int i = 0; i < 5; i++) {
        mainPtr->sub1.arr[i] = i + 1;
    }
    mainPtr->sub1.size = 5;

    mainPtr->sub2.arr = (int*)malloc(3 * sizeof(int));
    if (mainPtr->sub2.arr == NULL) {
        free(mainPtr->sub1.arr);
        free(mainPtr);
        return NULL;
    }
    for (int i = 0; i < 3; i++) {
        mainPtr->sub2.arr[i] = i + 3;
    }
    mainPtr->sub2.size = 3;

    mainPtr->name = (char*)malloc((strlen("example") + 1) * sizeof(char));
    if (mainPtr->name == NULL) {
        free(mainPtr->sub1.arr);
        free(mainPtr->sub2.arr);
        free(mainPtr);
        return NULL;
    }
    strcpy(mainPtr->name, "example");

    return mainPtr;
}

// 释放内存的函数
void freeMain(struct Main* mainPtr) {
    if (mainPtr != NULL) {
        if (mainPtr->sub1.arr != NULL) {
            free(mainPtr->sub1.arr);
        }
        if (mainPtr->sub2.arr != NULL) {
            free(mainPtr->sub2.arr);
        }
        if (mainPtr->name != NULL) {
            free(mainPtr->name);
        }
        free(mainPtr);
    }
}

你可以这样调用这些函数:

int main() {
    struct Main* mainObj = createMain();
    if (mainObj != NULL) {
        // 使用mainObj
        freeMain(mainObj);
    }
    return 0;
}