为什么我在尝试递归导航C中的目录时会遇到SEGFULT?

为什么我在尝试递归导航C中的目录时会遇到SEGFULT?,c,recursion,dirent.h,C,Recursion,Dirent.h,这是我的op/sys类中的一个项目。 我的最终目标是递归地复制目录 下面的函数在看到目录时会导致segfault。 我还没有使用这些函数进行复制。我只是想把导航弄下来。 source是我正在导航的目录,dest现在是一个占位符 当dp是目录时,它在箭头处失败 static void clone(const char* source, const char* dest){ DIR *dirp; struct dirent *dp; dirp = opendir(source

这是我的op/sys类中的一个项目。 我的最终目标是递归地复制目录

下面的函数在看到目录时会导致segfault。 我还没有使用这些函数进行复制。我只是想把导航弄下来。 source是我正在导航的目录,dest现在是一个占位符

当dp是目录时,它在箭头处失败

static void clone(const char* source, const char* dest){
    DIR *dirp;
    struct dirent *dp;
    dirp = opendir(source);
    dp = readdir(dirp);
    while (dp != NULL){
        if (strcmp(dp->d_name, "..") && strcmp(dp->d_name, "."))
        switch (dp->d_type) {
            case DT_DIR:
                printf("dir: %s\n", dp->d_name);
                //saved for making copy
->              clone(dp->d_name, dest);
                break;
            default:
                printf("fil: %s\n", dp->d_name);
                break;
        }
        dp = readdir(dirp);
    }
    closedir(dirp);
}
编辑:


我讨厌把时间花在一个问题上,然后寻求帮助,然后马上让它工作。答案发布在下面。

我将其更改为传递下一个目录的完整路径,而不是相对路径

static void clone(const char* source, const char* dest){
    DIR *dirp;
    struct dirent *dp;
    dirp = opendir(source);
    dp = readdir(dirp);
    while (dp != NULL){
        char rsource[512];
        strcpy(rsource, source);
        strcat(rsource, "/");
        strcat(rsource, dp->d_name);

        if (strcmp(dp->d_name, "..") && strcmp(dp->d_name, "."))
        switch (dp->d_type) {
            case DT_DIR:
                printf("dir: %s\n", dp->d_name);
                //saved for making copy

                clone(rsource, dest);
                break;
            default:
                printf("fil: %s\n", dp->d_name);
                break;
        }
        dp = readdir(dirp);
    }
    closedir(dirp);
}

我认为问题在于您没有检查
opendir()
的结果,并且随着递归的深入,您需要为
readdir()
返回的名称添加更多前缀,但我看不到您添加数据的证据。或者,您必须使用
chdir()
来深入目录层次结构,但这是一个更令人担忧的过程。总体而言,您需要正确地为名称添加前缀,并更仔细地检查错误。请将解决方案作为答案发布,以明确它是解决方案注意:建议更改
char rsource[512]方法。1) 它非常有限2)它在每个递归级别创建一个副本。相反,在顶部,传入指定大小的工作缓冲区。