#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
// 1. 使用malloc为Outer结构体动态分配内存
struct Outer *outer = (struct Outer *)malloc(sizeof(struct Outer));
if (outer == NULL) {
perror("malloc for outer");
return 1;
}
// 2. 对Inner结构体成员赋值
outer->inner.data1 = 42;
strcpy(outer->inner.data2, "Hello");
// 3. 对double成员赋值
outer->num = 3.14;
// 4. 为str成员动态分配内存并赋值字符串
outer->str = (char *)malloc(20 * sizeof(char));
if (outer->str == NULL) {
perror("malloc for str");
free(outer); // 释放已分配的outer内存
return 1;
}
strcpy(outer->str, "This is a test string");
// 使用结构体成员
printf("data1: %d\n", outer->inner.data1);
printf("data2: %s\n", outer->inner.data2);
printf("num: %lf\n", outer->num);
printf("str: %s\n", outer->str);
// 5. 释放内存
free(outer->str);
free(outer);
return 0;
}
内存管理细节注意事项:
- 分配内存:
- 使用
malloc
分配内存时,要检查返回值是否为NULL
,以确保内存分配成功。如果内存分配失败,程序应妥善处理,例如打印错误信息并退出。
- 对于嵌套结构体
Inner
,不需要单独为其分配内存,因为Outer
结构体的内存空间已经包含了Inner
结构体的空间。
- 释放内存:
- 释放内存的顺序很重要,先释放
outer->str
指向的内存,因为它是单独分配的,然后再释放outer
指向的内存。如果顺序颠倒,会导致内存泄漏,因为outer
指向的内存一旦释放,outer->str
就成为野指针,无法再安全释放其指向的内存。
- 确保在程序结束前释放所有动态分配的内存,避免内存泄漏。在出现错误提前退出程序时,也要确保已分配的内存被正确释放。