2013-02-01 37 views
2
DIR * d; 
int dsize=0; 
struct dirent * de; 
char *dir[1024]; 
d=opendir("."); 
while ((de = readdir(d))) 
      {                    
       if((de->d_type) & DT_DIR) 
       { 
        dir[dsize]= de->d_name; 
        dsize++; 
       } 
      } 

我試圖將文件名的地址存儲到一個char指針數組中。與陣列的指針錯誤

有點生鏽的指針我回去讀了一些指針評論的頁面,但我是 不知道我在做什麼錯誤..不斷告訴我「警告:賦值從指針沒有投射整數」。我的語法是否因爲結構而關閉?

+1

什麼是'dirent','DT_DIR'和'd_name' –

+3

OT:['readdir()'](http://linux.die.net/man/3/readdir)可以,並且會覆蓋每個從文件移動到文件時,DIR結構中的文件名。你沒有「擁有」那個記憶,實現就是這樣。如果你想保留名字,你必須複製這些名字(即......分出'malloc()'或一個固定緩衝區解決方案)。從「man 3 readdir」開始:*「由readdir()返回的數據可能會被隨後對同一目錄流的readdir()調用覆蓋*」 – WhozCraig

+0

@ ivaylo它的一部分包括 DT_DIR告訴它的目錄或者不是,d_name是dir(char數組)的名稱,dirent只是庫中的一個結構 –

回答

5

您不能以這種方式存儲指針。它們每次都被覆蓋,你打電話給readdir然後你有一個指向無效內存的懸掛指針。如果你想存儲的目錄項,則必須複製整個名稱,而不僅僅是指針

char dir[1024][256]; 
while (de = readdir(d)) { 
    if (de->d_type & DT_DIR) { 
     if (dsize < 1024) { 
      strcpy(dir[dsize], de->d_name); 
      dsize++; 
     } 
    } 
} 

不要忘了dir數組邊界檢查。否則,您可能會覆蓋堆棧,這可能會導致崩潰。

+0

+1簡單的解決方案。應該檢查兩個邊界,字符串長度和'dir'數組長度,但是該馬已經在膠水工廠的一半處已經= P。很好的答案。 – WhozCraig

+0

在閱讀WhozCraig鏈接後,我覺得我明白了這一點。很簡單的答案 –