closedir() в c дает «двойной бесплатный или коррупционный (!предшествующий) Ошибка» Прервано»

#c

Вопрос:

 else if (S_ISDIR(file.st_mode)) { //if  is directory
   dir = opendir(argv[2]);
   if (dir == NULL) { //if invalid directory
     perror("Not a valid directory");
     closedir (dir);
     free(newFile);
     free(filePath);
     exit(EXIT_FAILURE);
   }
   while ((dent = readdir(dir)) != NULL) { //loop through each file
     if(dent->d_name[0]!='.' amp;amp; strncmp(dent->d_name, "wrap.", 5)!=0){ //if file doesn't start with '.' or "wrap."
       filePath = (char *) realloc(filePath, strlen(dent->d_name) strlen(argv[2]) 1);
       strncat(filePath, argv[2], strlen(argv[2])); //add directory path to file path
       strncat(filePath, "/", 1); // add slash
       strncat(filePath, dent->d_name, strlen(dent->d_name)); //add filename
       fileInputDescriptor = open(filePath,O_RDONLY);

       newFile = (char *) realloc(newFile, strlen(argv[2]) strlen(dent->d_name) 6); //newFile is name of new file

       strncat(newFile, argv[2], strlen(argv[2])); //add directory path to newFile
       strncat(newFile, "/wrap.", 6); //add /wrap.
       strncat(newFile, dent->d_name, strlen(dent->d_name)); //add file name to end

       fileOutputDescriptor = open(newFile, O_RDWR|O_CREAT, 0666); //create file

       wrap(width, fileInputDescriptor, fileOutputDescriptor);
       *newFile = '';
       *filePath = '';
       close(fileInputDescriptor);
       close(fileOutputDescriptor);
     }
   }
   closedir(dir); //close directory
}
 

Я пишу программу, которая возьмет все файлы в каталоге и создаст новую «завернутую» версию файла в том же каталоге, где текст в файле отформатирован по-другому. Код работает, но я получаю сообщение об ошибке «дважды свободен или поврежден (!до)». Прервано». Я узнал, что это происходит, когда вызывается closedir (), но я не могу понять, почему.

Комментарии:

1. Ваши relloc » с » закончились к часу. Вы забываете о нулевом терминаторе

2. использование strlen в качестве аргумента длины противоречит цели strncat . Кроме того, эти последовательные объединения являются хрестоматийным примером алгоритма Шлемиэля Художника.

3. Не звони closedir(dir) , когда opendir() вернется NULL .

4. Вместо множества strncat() вызовов используйте sprintf() для форматирования имени пути все сразу.

5. Если кто-то сказал вам, что strncat() это «безопаснее», вы неправильно поняли, как безопасно его использовать. Длина должна быть размером пространства, доступного в пункте назначения, а не длиной источника. Цель состоит в том, чтобы убедиться, что вы не пишете за рамками.