C语言指针问题:getDataAlt函数触发double free错误求助
C语言跨文件指针内存分配触发Double Free错误的解决方法
你的代码逻辑本身没问题,但test.c文件缺少必要的标准库头文件,这是导致double free的核心原因:
在test.c中,你调用了malloc和sprintf,但没有包含<stdlib.h>和<stdio.h>。C语言中,如果函数没有显式声明,编译器会默认它返回int类型。在64位系统下,int是32位,而指针是64位,malloc返回的64位内存地址会被截断成32位的int,再转换为char*时,地址已经被破坏。后续free这个损坏的指针时,就会触发内存错误(表现为double free或者无效指针访问)。
而main.c里的getData函数能正常运行,是因为main.c已经包含了<stdlib.h>和<stdio.h>,编译器能正确识别malloc和sprintf的函数签名。
修复步骤
修改test.c,添加缺失的头文件:
#include "test.h" #include <stdlib.h> // 提供malloc、free的声明 #include <stdio.h> // 提供sprintf的声明
重新编译运行后,free(anOtherAlt)就不会再触发double free错误了。
额外建议
- 编译时开启高等级警告(比如MingW的
-Wall -Wextra),编译器会直接提示你“隐式声明函数malloc”这类问题,能快速定位这类低级错误。 - 给
malloc添加失败检查,避免内存分配失败导致后续逻辑崩溃:
void getDataAlt(char** dst) { char* tmp = malloc(sizeof(char) * 50); if (tmp == NULL) { *dst = NULL; return; } sprintf(tmp, "This is a test.\r\n"); *dst = tmp; }
内容的提问来源于stack exchange,提问作者BagOfTricks
相关产品推荐
相关产品推荐

