所以我在运行时在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
,但仍需要访问它所指向的内容。