从目录中读取分段错误

时间:2014-01-31 14:51:58

标签: c unix segmentation-fault

我试图从2个目录中读取并将其内容放入两个动态数组中 当我读到我得到一个段错误。我能看到它的唯一地方就是在循环中添加?

 #include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>

int main(int argc, char** argv) {

  // get directory parameters



  DIR *dirA;
  DIR *dirB;
  struct dirent *dA;
  struct dirent *dB;

  //check if dir A exists
  if (!(dirA = opendir(argv[1])))
    fprintf(stderr,"Failed to open directory %s \n",argv[1]);
  //check if dir B exists
  if (!(dirB = opendir(argv[2])))
    fprintf(stderr,"Failed to open directory %s \n",argv[2]);
  //open dir
  dirA= opendir(argv[1]);
  dirB= opendir(argv[2]);
  int sizeA;
  int sizeB;

  while (0!= (dA = readdir(dirA)))
   {

      sizeA++;

    }

  while (0!= (dB = readdir(dirB)))
    {
      sizeB++;
    }
  char**contentsA;
  char**contentsB;
  contentsA=(char**)(malloc(80*sizeof(char*)));
  contentsB=(char**)(malloc(80*sizeof(char*)));
  int i=0;
  while (0!= (dA = readdir(dirA)))
    {
     contentsA[i]=dA->d_name;
      i++;
    }
  i=0;
     while (0!= (dB = readdir(dirB)))
   {
     contentsB[i]=dB->d_name;
   }
     for ( i=0; i<sizeA; i++)
{

  printf("%s\n", contentsA[i]);
}

  for ( i=0; i<sizeB; i++)
{

  printf("%s\n", contentsB[i]);
}
  printf("size a = %d \n size b = %d\n", sizeA, sizeB);
  return (EXIT_SUCCESS);
   }

我认为问题可能出在最后一个循环中

1 个答案:

答案 0 :(得分:1)

有很多错误。

一个是您从目录条目存储名称指针,但不复制字符串数据。你只是复制指针,它指向你不拥有的内存。所有名称很可能都指向内存中的相同位置。

此外,您永远不会使用每个目录中的项目数,而是硬编码80个条目。如果超过80,您将覆盖随机存储器。

你也应该关闭目录并重新打开它,或者(更好)在第二次循环之前调用rewinddir(),否则你的目录流就会耗尽。