当我尝试运行此程序时,我收到错误malloc():内存损坏。 该错误并非直接来自此函数,它发生在我尝试使用此函数后的malloc()时。如果我删除行免费(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()。关于include,我将它们放在我的代码中,但我不认为错过包含会导致内存损坏,因为它编译。另外,当我调用makeString()时,path包含一个字符串。我在代码中的不同位置使用makeString()。当我添加free(ch)错误时出现,但我不明白为什么释放主要分配的内存会导致内存损坏。
答案 0 :(得分:0)
发布的代码包含某些逻辑错误,例如:
strcat(chaine,nb);
但是初始字符串必须有一个NUL字节,否则不知道返回什么值(I.E. undefined behavior)
malloc()
的返回值在第一个字符中可能有也可能没有NUL字节。
这可能是发布代码导致seg故障事件的原因。
(您可以使用calloc()
而不是malloc()
另外,makeString()
的参数未初始化为任何特定的NUL终止字符串。因此,将该参数传递给strlen()
(因为遇到的第一个NUL字节很可能超出了&#39;路径数组的末尾)
一些建议:
这是一个可能适合您的代码版本。
#include <stdio.h> // printf(), sprintf()
#include <stdlib.h> // malloc()
#include <string.h> // strlen(), strcat()
// prototypes
char * makeString(char *ch);
char * makeString(char *ch)
{
// EDIT: this line was wrong: char *chaine = malloc(sizeof(ch) + 7) // large enough to handle any int value
char *chaine = malloc(strlen(ch) + 7);
sprintf( chaine, "%4lu", strlen( ch ) );
strcat( chaine, " " );
strcat( chaine, ch );
return chaine; // the caller must call `free()`
} // end function: makeString
int main( void )
{
char *path = "my path string";
path = makeString(path);
printf( "%s\n", path );
free(path);
} // end function: main
,输出为:
14 my path string