2009-12-28 71 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**会做。