面试题答案
一键面试#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
字符串,并释放分配的内存。