2016-10-05 93 views
1

我试图通过输入一些文件夹路径来提取文件名的程序。指针和字符的分段错误

结果是好的,但问题是在结果的结尾,有一些分段错误,我无法弄清楚。

这是我在写的。

#include <stdio.h> 
#include <dirent.h> 

int main() { 

char folderpath; 
printf("enter the path : \n"); 
scanf("%s",&folderpath); 



DIR *d; 
struct dirent *dir; 
d = opendir(&folderpath); 
if (d) 
{ 
    while((dir= readdir(d)) != NULL) 
    { 
     printf("%s\n", dir->d_name); 
    } 
    closedir(d); 

}; 

return 0; 
} 

而且,结果就像

enter the path : /Users/gui/Desktop/extract/extract 
. 
.. 
main 
main.c 
Segmentation fault: 11 

对不起,问像这样很简单的问题,我极力想弄清楚,但我不能。

感谢您阅读本问题。 最好的关注。

+0

在调试器下运行它,它会告诉你哪一行失败 – pm100

+0

folderpath只分配空间的单个字符,并且您试图将整个字符串读入它。将定义更改为'char folderpath [100];'或者具有足够空间的东西。然后摆脱scanf中的'&'。 – bruceg

+0

谢谢大家!我真的没想到会有这么多人帮助我。我会承诺我会帮助有编程问题的人!谢谢 !! –

回答

0

当您使用%s格式说明符呼叫scanf时,它需要一个指向字符数组的指针。你传递的是一个字符的地址。因此,它会将该变量的内存位置写入旁边的任何内容中。这调用undefined behavior

你需要传递一个字符数组scanf

char folderpath[256]; 
printf("enter the path : \n"); 
scanf("%s",folderpath); 

... 

d = opendir(folderpath); 
+0

感谢您的亲切解释。真的很感激! 现在我可以帮助与我有同样问题的人! 谢谢! –

0

你不能为一个字符做到这一点

char folderpath; 
printf("enter the path : \n"); 
scanf("%s",&folderpath); 

你已预留了空间。 YOu需要

char folderpath[MAX_PATH]; 
printf("enter the path : \n"); 
scanf("%s",&folderpath); 
+0

谢谢!但我不知道MAX_PATH可能需要长文件夹路径。 –

0

当你声明字符foldrpath只分配一个字节的内存,你可以只存储一个字符。当您尝试存储多个字节时,会导致分段错误(在这种情况下访问存储器位置在您的进程空间一侧)。因此,尝试使用类似char folderpath的数组[MAXFOLDERLENGTH],否则您可以通过调用malloc来获得连续的字节块,如 char foldrpath =(char)malloc(MAXFOLDERLENGTH),此malloc分配Heap区域中的内存,前面的声明会给你堆栈区分配的内存。希望这可以帮助

+0

谢谢!在这一刻我不太清楚堆区和栈区的区别,但我会搜索它!谢谢 !! –