所以基本上,当我试图运行一个递归打印文件和目录路径的函数时,问题就出现了。我在运行程序时进入终端的问题是“分段错误(核心转储)”。
有什么我能解决的建议吗?
编辑:最大长度定义为2048。
这是代码:

void list_recursive(char* path){
    DIR* dir;
    struct dirent *dirent;
    char * name = malloc(sizeof(char) * MAX_LEN);

    dir = opendir(path);
    if(dir != NULL){
        printf("SUCCESS\n");
        while((dirent = readdir(dir)) != NULL){
            if(strcmp(dirent->d_name, ".") != 0 && strcmp(dirent->d_name, "..") != 0){
                sprintf(name, "%s/%s", path, dirent->d_name);
                printf("%s\n", name);
            }
        }
        free(name);
        if(dirent->d_type == DT_DIR){
            list_recursive(dirent->d_name);
        }
        closedir(dir);
    }
    else {
        printf("ERROR\n");
        printf("invalid directory path\n");
    }
}

最佳答案

在退出时观察:

dirent = readdir(dir)) != NULL

所以,dirent == NULL。但是你有:
if(dirent->d_type == DT_DIR)

也就是说,当空指针seg出现错误时取消引用。也许你想在这段时间内得到这个?
另外,为了调试这一点,我在代码中插入了一堆printfs,以确定精确的分段线,这对于小程序和快速修复是一个很好的实践。
这对我来说是有效的(修正递归论证):
while((dirent = readdir(dir)) != NULL){
    if(strcmp(dirent->d_name, ".") != 0 && strcmp(dirent->d_name, "..") != 0){
        sprintf(name, "%s/%s", path, dirent->d_name);
        printf("%s\n", name);
        if(dirent->d_type == DT_DIR){
            list_recursive(name);
        }
    }
}

关于c - 在C,Linux中递归列出目录和文件时出现段错误(核心已转储),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49587398/

10-09 07:00
查看更多