You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:45:04