C语言 递归函数中带有读取目录时的分割错误



所以我在运行时在C 中得到一个分段错误(没有编译错误或带有 -Wall 的警告(。我找到了一个解决方案,但不明白为什么首先会发生错误。如果有人能向我解释这一点,那就太好了。我现在正在学习C,想要理解它,而不仅仅是有一个解决方案。

void read_dir (const char *path){ 
DIR *dir;
struct dirent *object;
dir = opendir(path);
if (dir == NULL) return;
object = readdir(dir);
while (object != NULL) {
char *name = object->d_name;
char fullPath[300];
sprintf(fullPath, "%s/%s", path, name); 
object = readdir(dir);  //put it here **error** placement 1
if (object->d_type == DT_DIR && strcmp(name,".") && strcmp(name,"..")) 
read_dir (fullPath); 
object = readdir(dir);// put it here **no error** placement 2
}   
closedir(dir);
}

代码像这样在 main 中运行

int main (){
read_dir("..");
return 0;
}

据我了解,SEG 错误/核心转储是在读取尝试读取不属于该程序的内存时。

根据我对回避的理解,只要函数不返回,它就会创建并让我的 var 存活,那么为什么这种简单的顺序更改会发生如此大的变化。

放置 1 的输出:

../.
../a.out
../scripts
../b.class
../b.java
../..
Segmentation fault (core dumped)

放置 2 的输出:

../.
../a.out
../scripts
../scripts/a.c
../scripts/b.c
../scripts/a.txt
../scripts/dir.c
../scripts/.
../scripts/a.out
../scripts/makefile
../scripts/c.c
../scripts/a.class
../scripts/char.c
../scripts/conf.h
../scripts/a.java
../scripts/..
../scripts/dir.backup
../b.class
../b.java
../..```
object = readdir(dir);  //put it here **error**
if (object->d_type == DT_DIR && strcmp(name,".") && strcmp(name,"..")) 
read_dir (fullPath); 

如果这个对readdir的调用返回NULL,你仍然通过尝试测试object->d_type来取消引用NULL,这将产生段错误。您无法更改object,但仍需要访问它所指向的内容。

相关内容

  • 没有找到相关文章

最新更新