2009-12-28 84 views
2

季節的問候!我有一個函數打印出一個char **的內容,它被用作一個數組來存儲一些字符串。聲明如下:通過引用將char **傳入函數

char** commandArray = (char**)malloc(historySize); 

其中historySize是一個全局int設置爲8,現在。該數組填充了用戶輸入的命令,以循環隊列的形式排列。有很多地方我可能想要打印緩衝區的內容,所以我做了一個函數。理想情況下,該函數接受對commandArray的引用並循環遍歷它,打印出它包含的內容。現在,我不得不說,指針和引用不是我的強項,所以我不確定我是否正確地做事。功能如下:

/* prints the contents of the history buffer */ 
void printHistory(char*** historyBuff) 
{ 
    /* a counter for the loop */ 
    int loopIdx = 0; 

    for (loopIdx = 0; loopIdx < historySize; loopIdx++) 
    { 
     /* print the current history item */ 
     printf ("\nhistoryBuff[%i] = %s\n", loopIdx, *historyBuff[loopIdx]); 
     fflush(stdout); 
    } 
} 

我通過我的字符**入函數是這樣的:

printHistory (&commandArray); 

目前的情況是,一切編譯罰款,但是當程序打印歷史,函數在循環的某個地方掛起,不會打印出char **中的內容。所以,我對你的問題是這樣的:我是否正確地傳遞了commandArray,我是否正確地聲明瞭函數,並且是否在函數中正確地引用它?

在此先感謝您的任何幫助或建議!

-Ben

回答

9
  1. 爲了讓你的代碼工作的方式是,你應該取消引用這樣的:

    (*historyBuff)[loopIdx]

    你寫的東西的方式,[]*因爲之前發生C中的運算符優先級,這不是你想要的。

  2. 您需要爲您的命令陣列分配更多空間。現在,它實際上不是大到足以容納historySizechar*的:

    char** commandArray = (char**)malloc(historySize * sizeof(char*)); 
    
  3. 你並不需要的‘參考’通過這個陣列。你可以像這樣聲明你的功能:

    void printHistory(char** historyBuff) 
    

    並直接通過commandArray。如果您打算在函數的某處更改實際的數組指針(例如,如果您需要realloc以獲得更多空間),則只需傳遞char***即可。

  4. 對於只打印東西的函數,您可以稍微進一步並聲明const。這是一個「保證」給調用者(只要你能保證用C任何東西),你不打算修改數組或字符串它:

    void printHistory(const char *const * historyBuff) 
    
+0

謝謝你們的幫助!該功能現在工作出色。再次,我非常感激。 – BReeves 2009-12-31 02:03:45

1

1。

malloc分配編號的字節,不指針。如果historySize是要分配字符指針的數量,你將需要改變:

char** commandArray = (char**)malloc(historySize); 

到:

char** commandArray = malloc(historySize * sizeof(char*)); 

2.

printHistory()不改變commandArray指針。您無需通過char***。 A char**會做。