C 中目录和文件的递归列表中的分段错误(核心转储),Linux
Segmentation fault(core dumped) in recursively listing of directories and files in C, Linux
所以当我尝试 运行 一个 递归打印文件和目录路径的函数时,问题基本上就出现了 。当我 运行 程序时,我在终端遇到的问题是“分段错误(核心转储)”。
有什么解决办法的建议吗?
编辑: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");
}
}
退出while时观察:
dirent = readdir(dir)) != NULL
所以,dirent == NULL
。但是你有:
if(dirent->d_type == DT_DIR)
即取消引用 NULL 指针 - seg-faulty 当它们出现时。也许你想要这个 if inside while?
顺便说一句,为了调试这个,我只是在你的代码中插入了一堆 printfs
到 pin-point 确切的分割线 - 这对于小程序和快速修复是很好的做法。
这对我有用(也修复了递归参数):
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);
}
}
}
所以当我尝试 运行 一个 递归打印文件和目录路径的函数时,问题基本上就出现了 。当我 运行 程序时,我在终端遇到的问题是“分段错误(核心转储)”。
有什么解决办法的建议吗?
编辑: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");
}
}
退出while时观察:
dirent = readdir(dir)) != NULL
所以,dirent == NULL
。但是你有:
if(dirent->d_type == DT_DIR)
即取消引用 NULL 指针 - seg-faulty 当它们出现时。也许你想要这个 if inside while?
顺便说一句,为了调试这个,我只是在你的代码中插入了一堆 printfs
到 pin-point 确切的分割线 - 这对于小程序和快速修复是很好的做法。
这对我有用(也修复了递归参数):
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);
}
}
}