【问题标题】:C language, readdir and segmentation fault on runningC语言,readdir和运行时的分段错误
【发布时间】:2014-04-22 09:09:07
【问题描述】:

当我尝试运行此代码时,它会返回分段错误 使用 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);





}

如果你能帮助我,谢谢

【问题讨论】:

  • 用符号编译(选项-g),然后使用调试器(gdb)运行代码。它将显示崩溃发生的确切位置,并允许您检查所有使用的变量。
  • 正确格式化来源肯定会提高阅读的接受度。
  • 总是检查 fopen() 的结果。

标签: c segmentation-fault readdir opendir dirent.h


【解决方案1】:

这可能不是唯一的问题,但是您将字符串文字 "." 传递给 readRep 函数,然后在此函数中使用 strcat 向其附加一些内容。你不能修改字符串字面量,当然也不能给它们附加任何东西。

【讨论】:

    【解决方案2】:
    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”,所以它可能包含垃圾。

    【讨论】:

      【解决方案3】:

      我想我找到了, readdir() 函数读取所有当前目录和子目录,... (我以为它只读取当前目录)

      因此,当我对函数 readRep() 进行递归调用时,这并不清楚,但处理起来可能会非常复杂。

      【讨论】:

        猜你喜欢
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-01
        相关资源
        最近更新 更多