如何正确为char[]使用malloc分配内存且无内存泄漏,替代C99变长数组
变长数组转malloc实现方案
修改步骤
- 第一步:引入依赖头文件
#include <stdlib.h> // 提供malloc、free函数声明 #include <string.h> // 提供strlen函数声明
- 第二步:替换原数组声明代码,新增分配成功校验
原代码char stack[strlen(input)];替换为:
size_t stack_size = strlen(input); // 如果你需要用stack存储完整的input字符串,需要多分配1字节存'\0'终止符,将上一行改为 stack_size = strlen(input) + 1; char *stack = malloc(stack_size); if (stack == NULL) { // 此处添加内存分配失败的处理逻辑,例如打印错误后退出程序 perror("malloc failed"); exit(EXIT_FAILURE); }
- 第三步:原有数组访问逻辑无需修改,
stack[i]的下标访问方式对malloc分配的堆内存同样生效。
避免内存泄漏的注意事项
- 原变长数组属于栈内存,出了定义的作用域会自动回收,替换为malloc的堆内存后生命周期完全由开发者控制,不会随作用域结束自动释放,必须手动调用free。
- 所有通过
malloc申请的内存,在彻底不再使用后必须调用free释放,释放语法为free(stack);。 - 不要修改
stack指针保存的原始内存地址:如果需要移动指针遍历内存,请额外定义一个临时指针保存原始地址,最终释放时传入原始地址,避免释放非法地址。 - 保证所有代码分支都能执行到free逻辑:如果申请内存的函数存在多个return分支,需在每个return前释放已申请的内存,避免遗漏。
- 内存释放后建议手动将指针置为NULL:
stack = NULL;,避免后续误用野指针。
完整使用示例
void demo(const char* input) { size_t stack_size = strlen(input); char *stack = malloc(stack_size); if (stack == NULL) { perror("malloc failed"); return; } // 此处添加业务逻辑,和原来用数组的操作完全一致 for (size_t i = 0; i < stack_size; i++) { stack[i] = input[i]; } // 业务逻辑结束,释放内存 free(stack); stack = NULL; }
内容的提问来源于stack exchange,提问作者Kush Patel
相关产品推荐
相关产品推荐

