2013-12-10 73 views
0

我有以下代碼將打印來自給定目錄的所有文件名。 但是錯誤是Segmentation fault (core dumped)。 我沒有經驗與指針使用strcpy。與strcpy一起使用時出現分段錯誤(核心轉儲)

skipping include 

extern int errno; 

typedef struct fileinfo 
{ 
char filename[256]; 
off_t filesize; 
time_t mtime; 
} FILE_INFO; 

int main(int argc, char **argv) { 

DIR *dir; 
struct dirent *d_ent; 
FILE_INFO **file_info; 
int i = 0, j = 1; 

if((dir = opendir("/")) ==NULL) goto err; 

file_info = (FILE_INFO **)malloc(sizeof(FILE_INFO *) * j); 

while((d_ent = readdir(dir)) != NULL) 
{ 
    file_info = (FILE_INFO **)realloc(file_info,sizeof(FILE_INFO *) * j); 
    strcpy(file_info[j]->filename, d_ent->d_name); //Error here Segmentation fault (core dumped) 

    j++; 
} 

for(i =0 ; i > j; i++) 
{ 
    printf("%s\n", file_info[i]->filename); 
} 

free(file_info); 
return 0; 
err: 
printf("Error is : %d : %s", errno, strerror(errno)); 
return 0; 
} 
+3

[請不要在C](http://stackoverflow.com/a/605858/28169)上投射'malloc()'和朋友的返回值。 – unwind

回答

0

您必須先爲文件名分配空間。

file_info[j]->filename=malloc(strlen(d_ent->d_name)+1); 
strcpy(file_info[j]->filename, d_ent->d_name); 

或使用對這種東西作出的strdup功能:

file_info[j]->filename=strdup(d_ent->d_name); 

無關,但在你的代碼中的另一個缺陷:

for(i =0 ; i > j; i++) 

應該讀

for(i =0 ; i < j-1; i++) 

它會好很多/然而,更容易初始化j = 0。

+0

你剛剛編輯「char * filename」到「char filename [256]」嗎?當文件名是一個數組時,你當然不必使用strdup。 Rohans的答案是正確的,但請記住C數組以索引0開頭。 –

+0

@Guntran Bohm不匹配類型當從類型'char *'分配類型'char [256]'時 – pmverma

+0

請參閱我的第一條評論:如果聲明char文件名[256]而不是char *文件名,你可以在這裏。錯誤是你的'j'索引出陣列。我的第一個答案或多或少是自動的,因爲很多人犯了同樣的錯誤;我沒有看到它不適用於你。 –

1

注意:可能還有其他問題,但是您建議的路線存在以下問題。

當你分配爲j元素,最後一個項目是在j-1訪問,因此更新您的行

//----------------v 
strcpy(file_info[j-1]->filename, d_ent->d_name); 

,而不是

strcpy(file_info[j]->filename, d_ent->d_name); 

而且,而是採用FILE_INFO **你應該使用FILE_INFO *file_info;(並相應地更新其他代碼)。

0

除了其他答案,linux中的文件長達255個字符。最大爲4095.寫入file_info[j]->filename時可能會發生緩衝區溢出。將file_info[j]->filename聲明爲char*,並在源字符串上調用strdup()以複製它。