C,Linux

时间:2018-03-31 11:46:30

标签: c linux terminal segmentation-fault coredump

所以基本上当我尝试运行递归打印文件和目录的路径的函数时,会出现问题。我在运行程序时遇到的问题是" 分段错误(核心转储)"。

我有什么建议可以解决这个问题吗?

编辑:MAX_LEN定义为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");
    }
}

1 个答案:

答案 0 :(得分:2)

退出时退出:

dirent = readdir(dir)) != NULL

所以,dirent == NULL。但是你有:

if(dirent->d_type == DT_DIR)

,取消引用NULL指针 - 它们来自seg-faulty。也许你想要这个里面一会儿吗?

顺便说一下,为了调试这个问题,我在你的代码中添加了一堆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);
        }
    }
}