自定义字符串数组释放函数触发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
相关产品推荐
相关产品推荐

