このプログラムを実行しようとすると、エラー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);
}
編集:申し訳ありませんが投稿したときに私はいくつかの情報を忘れてしまった。インクルードについて、私のコードにはありますが、インクルードされていないインクルードがコンパイル後にメモリ破損を起こすとは思わないでしょう。また、私はmakeString()を呼び出すとき、パスには文字列が含まれています。コード内の異なる場所でmakeString()を使用します。私は無料(チャネル)のエラーが表示されましたが、私はなぜメモリ破損の原因になるメモリをメインに割り当てられて解放するのか分からない追加が追加されました。
'STRCAT(CHAINE、NB)は、' 'としてchaine'内容はまだ定義されていません。 'path'と同じです。 – chux
makeString()では、makeString()が呼び出される前に初期化されていなかった "ch"の長さを調べようとしています...上記の@chuxのように、malloc()はそのメモリを初期化しませんあなたはそれをするか、代わりにcalloc()を呼び出す必要があります。 – TonyB
投稿されたコードに '#include'文がないので、コンパイルされません。実際のコードに何が含まれているのか推測したくないのです。 – user3629249