Вы не должны получать доступ к данным, возвращаемым readdir()
после вызова closedir()
. Это связано с тем, что closedir()
может освободить любые ресурсы (например, память), выделенные в opendir / readdir.
Если вы хотите сохранить структуру dirent *, вы можете переключиться на readdir_r
вариант readdir (с другим набором параметров).
ОБНОВЛЕНИЕ: Расшифровка вывода Valgrind:
V - note single space here; it is beginning of error message.
==3287== Invalid read of size 1
==3287== at 0x40069E0: strcat (mc_replace_strmem.c:176)
backtrace skipped
Valgrind говорит, что ошибка Reading of invalid data, sized 1 byte
, которая не является утечкой памяти. Это неверный доступ к памяти. И актер этого чтения - strcat()
(вызванный пропущенным обратным следом). Почему данные неверны? Есть субмессия
VV - note two spaces here, it is continuation of error message
==3287== Address 0x402a39b is 35 bytes inside a block of size 32,792 free'd
==3287== at 0x40057F6: free (vg_replace_malloc.c:325)
==3287== by 0xAF6C67: closedir (in /lib/libc-2.12.90.so)
Байт недействителен (не разрешен для чтения), поскольку он является частью сегмента памяти, который был свободен-d (вы не можете читать из памяти, которую вы только что освободили-d). Кто это сделал? Посмотрите на обратный след: closedir
был вызывающим свободным.