Ошибка сегментирования при попытке выполнить программу
При решении задачи
Для заданного каталога (аргумент 1 командной строки) и всех его подкаталогов вывести в заданный файл (аргумент 2 командной строки) и на консоль имена файлов, их размер и дату создания, удовлетворяющих заданным условиям: 1 – размер файла находится в заданных пределах от N1 до N2 (N1,N2 задаются в аргументах командной строки), 2 – дата создания находится в заданных пределах от M1 до M2 (M1,M2 задаются в аргументах командной строки).
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
int searchdir(char *name);
int maxsize=0;
int minsize=0;
long mindate=0;
long maxdate=0;
FILE *f1;
int main(int argc, char *argv[])
{
maxsize=atoi(argv[4]);
minsize=atoi(argv[3]);
maxdate=atol(argv[6]);
mindate=atol(argv[5]);
f1=fopen(argv[2],"w");
searchdir(argv[1]);
fclose(f1);
return 0;
}
int searchdir(char *name)
{
char dirname[256];
char newname[256];
DIR *d1;
struct dirent *d;
struct stat st1;
d1=opendir(name);
d=readdir(d1);
strcpy(dirname,name);
strcat(dirname,"/");
while (d!=NULL)
{
if (d->d_type == DT_DIR)
{
if ((strcmp(d->d_name,".")!=0)&&(strcmp(d->d_name,"..")!=0))
{
strcpy(newname,dirname);
strcat(newname,d->d_name);
searchdir(newname);
}
}
d=readdir(d1);
}
rewinddir(d1);
while ((d=readdir(d1))!=0)
{
if (d->d_type==DT_REG)
{
strcpy(newname, dirname);
strcat(newname,d->d_name);
stat(newname,&st1);
if (((st1.st_size)>=minsize)&&((st1.st_size)<=maxsize))
{
if (((st1.st_mtime)>=mindate)&&((st1.st_mtime)<=maxdate))
{
fprintf(f1,"%s %d %d\n",newname,st1.st_size,st1.st_mtime);
printf("%s %d %d\n",newname,st1.st_size,st1.st_mtime);
}
}
}
d=readdir(d1);
}
closedir(d1);
}
Компиляция происходит успешно, однако при попытке выполнения
./app.exe ./bin out.txt 0 100 1000000000 1300000000
Столкнулся с ошибкой Ошибка сегментирования (стек памяти сброшен на диск)
В чем может быть проблема?
Ответы (1 шт):
Падает из за того, что вызов d1=opendir(name); в 41 строке может вернуть NULL и последующий readdir не очень хочет работать с нулем (NULL). Элементарная проверка вида if (d1 == NULL) return 1; сразу делает приложение рабочим.