如何修复C语言中使用结构体dirent时的分割错误



我的代码打印给定路径中的文件/目录名称(用户将其作为命令行参数输入(。使用目录中的给定路径执行时,它工作正常,但如果用户不提供任何命令行参数,它应该对当前工作目录执行相同的操作。

如果我只是以以下身份运行,我就会遇到 seg 错误:./a.out
当我以以下方式运行时它有效:./a.out /path

请通过提供必要的代码片段来修复我的代码

我尝试进行调试,发现它在执行 depthFirst 函数中的行后立即出现错误

printf("%sn", sd->d_name);

我的错误代码:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <limits.h>
void depthFirst(char * path){
struct dirent *sd;
DIR *dir;
//char path[PATH_MAX];
dir = opendir(path);

if(dir == NULL){
printf("Error, unable to openn");
exit(1);
}
while( (sd = readdir(dir)) != NULL){
if(strcmp(sd->d_name, ".") != 0 && strcmp(sd->d_name, "..") != 0){
printf("%sn", sd->d_name);
realpath(sd->d_name,path);
if(isdirectory(path)){
printf("t");
depthFirst(sd->d_name);
}
}
}

closedir(dir);
}
int isdirectory(char *path) {
struct stat statbuf;
if (stat(path, &statbuf) == -1)
return 0;
else
return S_ISDIR(statbuf.st_mode);
}
int main(int argc, char *argv[]){
char * path;
char * currentDirectory;
if(argc<2){
currentDirectory = ".";
depthFirst(currentDirectory);
}
else{
path = argv[1];
depthFirst(path);
}
return 0;
}

输出如下所示:

.git
Segmentation fault

>乔纳森在评论中击败了我,但此更改可防止该问题。

@@ -9,7 +9,7 @@
void depthFirst(char * path){
struct dirent *sd;
DIR *dir;
-        //char path[PATH_MAX];
+        char rpath[PATH_MAX];
dir = opendir(path);
@@ -22,8 +22,8 @@
while( (sd = readdir(dir)) != NULL){
if(strcmp(sd->d_name, ".") != 0 && strcmp(sd->d_name, "..") != 0){
printf("%sn", sd->d_name);
-                        realpath(sd->d_name,path);
-                        if(isdirectory(path)){
+                        realpath(sd->d_name,rpath);
+                        if(isdirectory(rpath)){
printf("t");
depthFirst(sd->d_name);

正如另一条评论指出的那样,您不能重用char* path,因为它存储在程序无法写入的内存页中。因此,realpath()在尝试写入它时会崩溃。

相关内容

  • 没有找到相关文章

最新更新