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

自定义字符串数组释放函数触发double free错误,代码存在什么问题?

问题分析与修复

你的代码触发free(): double free detected in tcache 2 Aborted错误,核心有两个问题:

  • 错误释放栈内存:main函数里的arr是栈上分配的局部数组,不是通过malloc/calloc等动态内存分配函数申请的内存。而ffree函数最后调用free(a),试图释放栈内存,这属于未定义行为,直接破坏内存管理结构,引发错误。
  • 数组缺少终止NULL标记:arr里只存了两个字符串指针,但没有以NULL结尾。ffree里的while (*pp)循环会一直向后遍历栈上的内存,直到碰到随机值,过程中可能释放不属于你的内存,或越界访问后触发后续内存错误。

修复后的代码

方案1:使用动态分配的指针数组(适配原ffree逻辑)

把数组改成动态分配,并添加终止NULL:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void ffree(char **pp)
{
    if (!pp)
        return;

    char **a = pp;

    while (*pp) {
        free(*pp);
        pp++;
    }

    free(a); // 现在a是动态分配的内存,可安全释放
}

int main() {
    char *str1 = strdup("Hello");
    char *str2 = strdup("World");
    
    // 动态分配指针数组,最后加NULL作为终止标记
    char **arr = malloc(sizeof(char*) * 3);
    arr[0] = str1;
    arr[1] = str2;
    arr[2] = NULL;

    ffree(arr);

    return 0;
}

方案2:保留栈数组(修改ffree逻辑)

如果必须用栈数组,ffree只能释放数组内的字符串指针,不能释放数组本身,同时要给数组加NULL终止:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

// 只释放数组内的字符串指针,不释放数组本身
void free_strings(char **pp)
{
    if (!pp)
        return;

    while (*pp) {
        free(*pp);
        pp++;
    }
}

int main() {
    char *str1 = strdup("Hello");
    char *str2 = strdup("World");
    
    // 栈数组,最后加NULL
    char *arr[] = {str1, str2, NULL};

    free_strings(arr);

    return 0;
}

内容的提问来源于stack exchange,提问作者Abelrahman hussein Ragab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 09:57:06