Язык C, readdir и ошибка сегментации при запуске
Этот код возвращает ошибку сегмента, когда я пытаюсь его запустить. Ничего не появляется при сборке файла с помощью gcc.
Если у вас есть идея о том, где искать, чтобы исправить это, дайте ваш совет, спасибо.
обязательно в функции readrep(), которая должна произойти, особенно с opendir() и readdir(), но я не вижу что-то не так, благодаря помощи
#include<dirent.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<limits.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAX 256
FILE* f;
void gowrite(char * chemin){
f=fopen("locate.db.tmp","a+");
int size=strlen(chemin);
char str[MAX];
fwrite(&size,sizeof(int),1,f);
fwrite(str,sizeof(char),size,f);
fclose(f);
}
void readRep(char* str){
struct dirent repStruct;
struct dirent * prepStruct;
struct stat structStat;
struct stat *buff;
buff=&structStat;
prepStruct=&repStruct;
DIR * d=opendir(str);
while((prepStruct=readdir(d))!=NULL){
int x;
char* fi=malloc(sizeof(char)*MAX);
fi=(prepStruct->d_name);
x=stat(fi,buff);
mode_t m;
m=structStat.st_mode;
int test;
test=S_ISREG(m);
if(test==0){
strcat(str,"/");
strcat(str,fi);
readRep(str);
}
else{
char *chemin=realpath(fi,NULL);
gowrite(chemin);
free(chemin);
chemin=NULL;
}
}
}
int main(int argN,char** argv){
char* path=getenv("HOME");
chdir(path);
readRep(".");
rename("locate.db.tmp","locate.db");
exit(0);
}
Если вы можете помочь мне спасибо
3 ответа
Возможно, это не единственная проблема, но вы переходите к readRep
функционировать строковый литерал "."
а затем в этой функции вы используете strcat
добавить что-то к этому. Вы не можете изменять строковые литералы, и наверняка вы не можете ничего добавить к ним.
void gowrite(char * chemin){
f=fopen("locate.db.tmp","a+");
int size=strlen(chemin);
char str[MAX];
fwrite(&size,sizeof(int),1,f);
fwrite(str,sizeof(char),size,f);
fclose(f);
"chemin"/"size" и "str"/"MAX" не имеют ничего общего, даже размеры. Но вы используете один для вывода другого. уродливый
Кстати: вы не инициализируете "str", поэтому он может содержать мусор.
Я думаю, что я нашел, функция readdir() читает все текущие директории и подкаталоги... (я думал, что это только для чтения текущей директории)
Поэтому, когда я делаю рекурсивный вызов моей функции readRep(), это не ясно, но это может привести к большой сложности, с которой нужно справиться.