我的c代码中的分段错误

时间:2015-06-20 02:39:31

标签: c segmentation-fault malloc readdir

我在代码中遇到分段错误的原因是什么。
   我认为这是因为cur = readdir(dr)中的while循环;当我试图错误输入时,它不会进入while循环。

int main(char *source)
  { 
   DIR *dr;
    struct dirent *cur;
    struct stat fi;
    long int total_size = 0;
    dr = opendir(source);
    char *name=source;
    size_t sourcelen = strlen(source);
    printf("\n\n Source is %s\n\n\n", source);
    printf("before *path \n");
    char *path = malloc(100);
    strcpy(path,source);
    printf("before while \n");
    while ((cur = readdir(dr)) != NULL)
    {

      if(cur->d_name[0] != '.')
            {
                    free(path);
                    path = malloc(sourcelen + strlen(cur->d_name) + 2);
                    strcat(path,source);
                    strcat(path,"/");
                    strcat(path,cur->d_name);
                    if(stat(path, &fi) == -1)
                   {
                            printf("error \n\n");
                    }
                    else
                    {

                    printf("%s  ",cur->d_name);
                    printf("%ld  ",fi.st_blocks);
                    total_size = total_size + fi.st_blocks;
                    }
            }
    }
    printf("\n\ntotal_size = %ld \n", total_size);
    printf("\n\n\n");

}

1 个答案:

答案 0 :(得分:2)

你有:

int main(char *source)

这是main()的完全非正统且可能不受支持的定义。有关允许和不允许的完整故事,请参阅What should main() return in C and C++

几乎可以肯定是你的分段错误的原因。你有:

DIR *dr;
…
dr = opendir(source);

你实际上有一个(小但非零)int被视为({?1}}的一部分?char *,这将导致麻烦。

你需要:

int main(int argc, char **argv)
{
    if (argc != 2)
        …report error and do not continue…
    DIR *dr = diropen(argv[1]);
    …error check dr and continue if not null…