【发布时间】:2017-05-22 13:57:36
【问题描述】:
当我尝试运行该程序时,我收到错误 malloc(): memory corruption。 该错误并非直接来自此函数,它发生在我尝试在此函数之后执行 malloc() 时。如果我删除了 free(ch) 行,它可以正常工作,所以我猜想当我尝试释放它时会发生损坏。 main() 是我如何使用该函数的示例。
char * makeInt(int val){
char *res = malloc(5);
char l [5] = "";
sprintf(l,"%d",val);
if(val < 10){
strcat(res,"000");
strcat(res,l);
}
else if(val < 100){
strcat(res,"00");
strcat(res,l);
}
else if(val < 1000){
strcat(res,"0");
strcat(res,l);
}
else if( val < 10000){
strcat(res,l);
}
res[4] = '\0';
return res;
}
char * makeString(char *ch){
int t = strlen(ch);
char *chaine = malloc(t+4);
char *nb = makeInt(t);
strcat(chaine,nb);
strcat(chaine,ch);
chaine[t+4] = '\0';
free(ch);
return chaine;
}
int main(){
char *path = malloc(100);
// here we do many operations on path, when i call makeString, path contains something
path = makeString(path);
}
编辑:抱歉,我发布的时候太晚了,我忘记了一些信息。 我添加了 makeInt()。关于包含,我将它们包含在我的代码中,但我认为错过的包含不会导致内存损坏,因为它会编译。此外,当我调用 makeString() 时,路径包含一个字符串。我在代码中的不同位置使用 makeString()。当我添加 free(ch) 时出现错误,但我不明白为什么释放 main 中分配的内存会导致内存损坏。
【问题讨论】:
-
strcat(chaine,nb);aschaine内容尚未定义。path也一样。 -
在 makeString() 中,您尝试确定“ch”的长度...在调用 makeString() 之前未初始化...正如上面确定的 @chux,malloc() 确实不初始化它为你分配的内存......要么你必须这样做,要么调用 calloc() 代替。
-
发布的代码缺少
#include语句,因此无法编译。 (我们中的许多人不想猜测您的实际代码包含什么。 -
您应该注意函数的返回类型以及您分配给什么类型的类型。例如,函数
strlen()返回一个size_t,并且发布的代码将其分配给int类型。如果你在编译时打开警告,那么你的编译器会告诉你这些你应该在代码中修复的问题 -
C 数组索引是基于
0的,所以这个chaine[t+4] = '\0';写入数组的过去。
标签: c malloc free corruption