#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义结构体
typedef struct {
char *str;
} MyStruct;
// 修改动态分配内存内容的函数
void modifyStruct(MyStruct *s, const char *newStr) {
// 释放旧的内存
free(s->str);
// 分配新的内存
s->str = (char *)malloc(strlen(newStr) + 1);
if (s->str == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
// 复制新字符串
strcpy(s->str, newStr);
}
int main() {
MyStruct s;
s.str = (char *)malloc(10);
if (s.str == NULL) {
perror("malloc");
return 1;
}
strcpy(s.str, "old");
modifyStruct(&s, "new");
printf("Modified string: %s\n", s.str);
// 释放内存
free(s.str);
return 0;
}
内存管理要点
- 动态内存分配:使用
malloc
等函数为结构体中的动态成员分配内存,并检查返回值是否为NULL
,以确保分配成功。
- 内存释放:在使用完动态分配的内存后,必须使用
free
函数释放它,避免内存泄漏。在modifyStruct
函数中,先释放旧的内存,再分配新的内存。
- 内存泄漏检测:在开发过程中,可以使用工具(如Valgrind)来检测内存泄漏,及时发现并修复问题。
- 正确的字符串处理:使用
strcpy
等函数时,要确保目标缓冲区有足够的空间容纳源字符串,避免缓冲区溢出。这里在分配内存时考虑了字符串长度并加上终止符'\0'
的空间。