MST
星途 面试题库

面试题:C语言联合体数组在内存管理中的应用

给定一个联合体数组,联合体中有两个成员,一个是int类型的id,另一个是char类型的长度为20的字符串name。要求设计一个函数,该函数接收这个联合体数组及其长度作为参数,通过动态内存分配,创建一个新的数组,新数组中只包含原联合体数组中id为偶数的元素的name字符串,最后释放原联合体数组的内存,并返回新创建的数组。请写出函数实现及必要的测试代码。
11.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

// 定义联合体
union Member {
    int id;
    char name[20];
};

// 设计函数
char** filterNames(union Member* arr, int len, int* newLen) {
    int count = 0;
    // 统计id为偶数的元素个数
    for (int i = 0; i < len; i++) {
        if (arr[i].id % 2 == 0) {
            count++;
        }
    }

    *newLen = count;
    // 动态分配内存给新数组
    char** newArr = (char**)malloc(count * sizeof(char*));
    if (newArr == NULL) {
        perror("malloc");
        return NULL;
    }

    int index = 0;
    // 填充新数组
    for (int i = 0; i < len; i++) {
        if (arr[i].id % 2 == 0) {
            newArr[index] = (char*)malloc(strlen(arr[i].name) + 1);
            if (newArr[index] == NULL) {
                // 释放已分配的内存
                for (int j = 0; j < index; j++) {
                    free(newArr[j]);
                }
                free(newArr);
                perror("malloc");
                return NULL;
            }
            strcpy(newArr[index], arr[i].name);
            index++;
        }
    }

    // 释放原联合体数组的内存,这里原数组是栈上分配的,不需要手动释放
    // 如果是动态分配的,需要在这里添加free(arr);

    return newArr;
}

// 测试代码
int main() {
    union Member arr[] = {
        {1, "Alice"},
        {2, "Bob"},
        {3, "Charlie"},
        {4, "David"}
    };
    int len = sizeof(arr) / sizeof(arr[0]);
    int newLen;
    char** result = filterNames(arr, len, &newLen);

    if (result != NULL) {
        for (int i = 0; i < newLen; i++) {
            printf("%s\n", result[i]);
            free(result[i]);
        }
        free(result);
    }

    return 0;
}

上述代码首先定义了一个联合体Member,然后实现了filterNames函数,该函数接收联合体数组及其长度作为参数,动态分配内存创建新数组,新数组只包含原联合体数组中id为偶数的元素的name字符串,最后释放原联合体数组(如果是动态分配的)并返回新数组。在main函数中进行了测试,输出筛选后的name字符串,并释放分配的内存。