C перечислением имен каталогов из другого каталога - PullRequest
0 голосов
/ 21 июня 2019

Я пишу программу, в которой перечислены имена каталогов. Это не очень сложный код, но после запуска моей программы я получаю странную ошибку

#include <dirent.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>


int main() {
    struct dirent * dir;
    struct stat buf;
    DIR *d;
    if(d = opendir("/..."))
    {
        while(dir = readdir(d))
        {
            if(S_ISDIR(buf.st_mode))
                puts(dir->d_name);
            closedir(d);
        }
    }
    else
        perror("read");
return 0;
}

Я получаю вывод

*** Error in `./names.exe': double free or corruption (top): 0x00000000011d3010 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x81499)[0x7f702b1bc499]
/lib64/libc.so.6(closedir+0xd)[0x7f702b1fbaed]
./names.exe[0x40068d]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7f702b15d445]
./names.exe[0x400579]
======= Memory map: ========

Что я сделал не так?

1 Ответ

5 голосов
/ 21 июня 2019

Вы закрываете поток каталога, когда читаете его.Измените:

while(dir = readdir(d))
{
    if(S_ISDIR(buf.st_mode))
        puts(dir->d_name);
    closedir(d);
}

на:

while(dir = readdir(d))
{
    if(S_ISDIR(buf.st_mode))
        puts(dir->d_name);
}
closedir(d);

Таким образом, вы не закроете его, пока не закончите.

...