面试题答案
一键面试整体思路
- 定义结构体和联合体:定义包含联合体的结构体,联合体中定义不同类型成员。
- 动态分配内存函数:在函数中根据传入参数动态分配结构体内存,根据参数类型初始化联合体不同成员。
- 内存释放函数:编写函数释放动态分配的结构体内存,注意如果联合体中有动态分配的数组,也要释放其内存。
核心代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义联合体
union Data {
float f;
int arr[5];
};
// 定义结构体
struct MyStruct {
union Data data;
int type; // 用于标记联合体中使用的成员类型,0代表float,1代表int数组
};
// 动态分配内存并初始化函数
struct MyStruct* createMyStruct(int type) {
struct MyStruct* newStruct = (struct MyStruct*)malloc(sizeof(struct MyStruct));
if (newStruct == NULL) {
return NULL;
}
newStruct->type = type;
if (type == 0) {
newStruct->data.f = 3.14f;
} else if (type == 1) {
for (int i = 0; i < 5; i++) {
newStruct->data.arr[i] = i;
}
}
return newStruct;
}
// 释放内存函数
void freeMyStruct(struct MyStruct* structPtr) {
if (structPtr != NULL) {
free(structPtr);
}
}
你可以使用以下方式调用这些函数:
int main() {
struct MyStruct* myStruct1 = createMyStruct(0);
struct MyStruct* myStruct2 = createMyStruct(1);
if (myStruct1 != NULL) {
if (myStruct1->type == 0) {
printf("Float value: %f\n", myStruct1->data.f);
} else if (myStruct1->type == 1) {
printf("Int array values: ");
for (int i = 0; i < 5; i++) {
printf("%d ", myStruct1->data.arr[i]);
}
printf("\n");
}
freeMyStruct(myStruct1);
}
if (myStruct2 != NULL) {
if (myStruct2->type == 0) {
printf("Float value: %f\n", myStruct2->data.f);
} else if (myStruct2->type == 1) {
printf("Int array values: ");
for (int i = 0; i < 5; i++) {
printf("%d ", myStruct2->data.arr[i]);
}
printf("\n");
}
freeMyStruct(myStruct2);
}
return 0;
}