2017-10-14 19 views
0

割り当てられたメモリを解放しようとするまで、私のコードは正常に動作しています。私はmallocfilesポインタを編集し、後で私はreallocを使ってサイズを増やしました。しかし、私はメモリを解放しようとすると無効なポインタエラーを出しますが、その理由はわかりません。CでReallocに割り当てられたメモリを解放できません

char *files = malloc(1); 
char *temp = strdup(argv[i]); 
strcat(temp, "/"); 
strcat(temp, dp->d_name); 
DIR *child_dir; 
child_dir = opendir (temp); 

if (child_dir == NULL) { 
    files = realloc(files, strlen(dp->d_name)+1); 
    strcat(files, dp->d_name); 
    strcat(files, "/"); 
} else { 
    struct dirent *child_dp; 
    while ((child_dp = readdir (child_dir)) != NULL) { 
     if (!strcmp(child_dp->d_name, ".") 
      || !strcmp(child_dp->d_name, "..")) 
       continue; 

     files = realloc(files, strlen(child_dp->d_name) + 1); 
     strcat(files, child_dp->d_name); 
     strcat(files, "/"); 
    } 
} 
close(fd[0]); 
int n = write(fd[1], files, strlen(files)); 
free(temp); // free 
free(files); // free 
temp = NULL; 
files = NULL; 
return; 

これは私が取得していますエラーで、

======= Backtrace: ========= 
/lib64/libc.so.6(+0x721af)[0x7fa2e697c1af] 
/lib64/libc.so.6(+0x77706)[0x7fa2e6981706] 
/lib64/libc.so.6(+0x78453)[0x7fa2e6982453] 
./myfind[0x40110c] 
./myfind[0x400b02] 
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7fa2e692a6e5] 
./myfind[0x400a09] 
======= Memory map: ======== 

注:私は、任意のメモリ領域を解放することなく、同じコードを実行した場合、それが正常に動作します。これは、ポインタがメモリ内の正しい場所を指していることを意味します。あなたはこのコードを使用して、ヒープが破損している

+2

'strcat(temp、"/");'を実行すると、未定義の動作が発生します。 'temp'はあなたがそれをコピーした' argv [i] '文字列のためだけに十分ですが、それに追加の文字列を連結する余地はありません。 – Barmar

答えて

2

char *temp = strdup(argv[i]); 
strcat(temp, "/"); 
strcat(temp, dp->d_name); 

strdupは、それが複製だ文字列のための十分なスペースを割り当てていますが、その後、部屋を作るために再割り当てすることなく、最後に多くを連結します。

if状態にしたときreallocfilesほとんどの場合、あなたは(あなたがが正しい量を割り当てる必要があります)それと逃げるだろうけれどもまた、NULターミネータのためのスペースを残していません。

最後に、elsewhileループでは、各reallocはあなたが追加しているもののための十分な配分が、すでに存在しているもののためのスペースを残していない(何度も、何のスペースがNULターミネータ放置されていない)されます。繰り返しの誤用は、しばらくしてヒープの破損が保証されます。

+1

* "ほとんどの場合、あなたは" *、間違った印象を残さないかもしれないとは確信していません....もしかしたら、 "*')、または多分ただ "*未定義の動作結果" * ':)' –

+0

@ DavidC.Rankin:ええ、私はちょうど間違いがあることを指摘しています。一部またはすべてのコンパイラ/システムで症状が発生するため、コードが正しいと言うだけでは機能しません。 – ShadowRanger

+0

はい、私はあなたが言っていたことの要点を理解しました。今週の金曜日の夜にちょっと奇妙な/ユーモラスなように私を殴っただけです(したがって ':)' –

関連する問題