2016-10-05 115 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

謝謝!在這一刻我不太清楚堆區和棧區的區別,但我會搜索它!謝謝 !! –