#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义结构体
typedef struct {
char *str;
} MyStruct;
// 初始化结构体
MyStruct* initMyStruct(const char *defaultStr) {
MyStruct *obj = (MyStruct*)malloc(sizeof(MyStruct));
if (obj == NULL) {
return NULL;
}
obj->str = (char*)malloc(strlen(defaultStr) + 1);
if (obj->str == NULL) {
free(obj);
return NULL;
}
strcpy(obj->str, defaultStr);
return obj;
}
// 释放结构体内存
void freeMyStruct(MyStruct *obj) {
if (obj != NULL) {
if (obj->str != NULL) {
free(obj->str);
}
free(obj);
}
}
- 函数内部定义结构体:
- 内存管理差异:函数结束时,结构体变量本身会自动释放,但结构体中动态分配的内存(如
obj->str
)不会自动释放,需要手动调用freeMyStruct
函数来释放,否则会造成内存泄漏。
- 注意事项:确保在函数返回前或者在函数执行过程中可能出现的提前退出情况(如错误处理)下,都要调用
freeMyStruct
释放内存。
- 作为全局变量定义结构体:
- 内存管理差异:全局变量的生命周期贯穿整个程序运行过程,程序结束时系统会自动回收全局变量占用的内存空间,但同样,结构体中动态分配的内存(
obj->str
)不会自动释放。需要在合适的地方手动调用freeMyStruct
函数释放内存,否则在程序运行过程中会一直占用内存,直到程序结束。
- 注意事项:一般在程序退出前(如在
main
函数结束前)调用freeMyStruct
来释放全局结构体中动态分配的内存。同时要注意,在多线程环境下,如果有多个线程可能访问该全局结构体,需要考虑线程安全问题,例如使用互斥锁来保护对结构体的操作,防止在释放内存时出现竞争条件。
int main() {
// 函数内部定义结构体
MyStruct *localObj = initMyStruct("Hello, local");
if (localObj != NULL) {
printf("Local struct str: %s\n", localObj->str);
freeMyStruct(localObj);
}
// 全局变量模拟(这里使用静态变量模拟全局变量的生命周期)
static MyStruct *globalObj = initMyStruct("Hello, global");
if (globalObj != NULL) {
printf("Global struct str: %s\n", globalObj->str);
freeMyStruct(globalObj);
}
return 0;
}