2014-02-19 36 views
-1

我想在C動態添加字符串到字符指針使用malloc和realloc

我有麻煩存儲字符數組內的指定目錄內的文件名來讀取使用的dirent頭文件的目錄。

代碼如下。

char * FileNames; 

while ((DirentPointer = readdir(DirectoryPointer)) != NULL) { 

    strcpy(&FileNames[Counter], DirentPointer -> d_name); 

    Counter++; 
} 

當我運行該應用程序時,我得到一個分段錯誤。我認爲strcpy由於內存分配而導致應用程序錯誤。

任何人都可以告訴我如何malloc和realloc可以用來動態地添加內存分配到FileNames Char *嗎?

+1

我想你的第一個問題是'FileNames'只是一個字符數組。你需要和指向字符的指針來存儲所有的名字'char ** FileNames;' –

+0

我是新來的語言,要誠實。如果我創建一個指向指針的指針,我怎樣才能在strcpy方法中引用數組?我應該使用&&嗎? – Andrew

+0

看看本教程,它可能很有用:http://www.cplusplus.com/doc/tutorial/pointers/ –

回答

1

你的代碼會產生未定義的行爲或最可能的崩潰。這是因爲FileNames是一個指向字符的指針,而不是內存緩衝區來複制字符串,函數strcpy不會對正在複製的緩衝區執行邊界檢查。因此strcpy將嘗試寫入您尚未分配用於此目的的內存。您需要先分配內存來複制文件名。

#define MAX_FILE_NUM 1000 

char *FileNames[MAX_FILE_NUM] = {0}; // initialize to NULL 
int Counter = 0; 

while((DirentPointer = readdir(DirectoryPointer)) != NULL) { 
    FileNames[counter] = malloc(strlen(DirentPointer->d_name) + 1); // + 1 for the null byte 
    // check for NULL 
    if(FileNames[i] != NULL) { 
     strcpy(FileNames[i], DirentPointer->d_name); 
     Counter++; 
    } 
    else { 
     // handle the NULL case 
     // maybe try malloc again 
    } 
} 

// after you are done with the FileNames 

for(int i = 0; i < Counter; i++) { 
    free(FileNames[i]); 
    FileNames[i] = NULL; 
} 
+0

謝謝你的迴應。我仍然試圖弄清楚如何使用指針。我試過你的代碼,但我在strcpy方法中遇到了不兼容的指針類型錯誤。 – Andrew

+0

我假設'DirentPointer-> d_name'是'char *'。你能告訴我它是什麼類型嗎? – ajay

+0

@Andrew對不起,我的代碼有錯誤。我已經更新了它。請現在再試一次,讓我知道它是否有效。 – ajay