Язык 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(), это не ясно, но это может привести к большой сложности, с которой нужно справиться.

Другие вопросы по тегам