割り当てられたメモリを解放しようとするまで、私のコードは正常に動作しています。私はmalloc
のfiles
ポインタを編集し、後で私は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: ========
注:私は、任意のメモリ領域を解放することなく、同じコードを実行した場合、それが正常に動作します。これは、ポインタがメモリ内の正しい場所を指していることを意味します。あなたはこのコードを使用して、ヒープが破損している
'strcat(temp、"/");'を実行すると、未定義の動作が発生します。 'temp'はあなたがそれをコピーした' argv [i] '文字列のためだけに十分ですが、それに追加の文字列を連結する余地はありません。 – Barmar