#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义联合体
union Data {
char str[20];
int num;
};
// 定义结构体
struct Element {
union Data data;
};
// 打印联合体数据
void printData(struct Element *element, int isString) {
if (isString) {
printf("String: %s\n", element->data.str);
} else {
printf("Integer: %d\n", element->data.num);
}
}
int main() {
int n = 5; // 数组元素个数
struct Element *array = (struct Element *)malloc(n * sizeof(struct Element));
if (array == NULL) {
perror("malloc");
return 1;
}
// 使用字符串
for (int i = 0; i < n; i++) {
sprintf(array[i].data.str, "String %d", i);
}
for (int i = 0; i < n; i++) {
printData(&array[i], 1);
}
// 使用整型
for (int i = 0; i < n; i++) {
array[i].data.num = i * 2;
}
for (int i = 0; i < n; i++) {
printData(&array[i], 0);
}
free(array);
return 0;
}
内存优化考虑
- 动态内存分配:在程序中使用
malloc
函数进行动态内存分配,根据实际需要的数组大小分配内存,避免静态数组造成的内存浪费。同时,每次malloc
后都检查返回值,确保内存分配成功,防止因分配失败而导致后续使用未初始化指针的错误。
- 内存释放:程序结束前使用
free
函数释放之前分配的内存,避免内存泄漏。这确保了动态分配的内存空间在不再使用时能够被系统回收,供其他程序使用。
- 联合体的使用:联合体共享内存空间,根据实际需求灵活切换使用不同类型的成员,避免了为每种数据类型单独分配内存,从数据结构层面优化了内存使用,使得在同一内存位置可以存储不同类型的数据,提高了内存利用率。