通过引用将char **传递给函数

时间:2009-12-28 16:32:14

标签: c function reference char dereference

季节的问候!我有一个函数打印出char **的内容,它被用作存储多个字符串的数组。声明如下:

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

其中historySize是一个设置为8的全局int,现在。该数组使用用户输入的命令填充,排序为循环队列。有几个地方我可能想要打印出缓冲区的内容,所以我做了一个功能。理想情况下,该函数接受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);
    }
}

我将我的char **传递给这样的函数:

printHistory (&commandArray);

现在看来,所有内容编译都很好,但是当程序打印历史记录时,该函数会挂起循环中的某个位置并且不会打印出char **中的内容。所以,我的问题是:我是否正确地传递了commandArray,我是否正确地声明了函数,我是否正确地在函数中取消引用它?

提前感谢您提供任何帮助或建议!

-Ben

2 个答案:

答案 0 :(得分:9)

  1. 为了使您的代码按原样运行,您应该取消引用:

    (*historyBuff)[loopIdx]

    你写作的方式,[]发生在*之前,因为C中的运算符优先级,而不是你想要的。

  2. 您需要为命令数组分配更多空间。现在它实际上不足以容纳historySize char*

    char** commandArray = (char**)malloc(historySize * sizeof(char*));
    
  3. 您无需通过“reference”传递此数组。您可以像这样声明您的函数:

    void printHistory(char** historyBuff)
    

    直接传递commandArray。如果您打算在函数中的某处更改实际的数组指针,则只需要传入char***(例如,如果您需要realloc它以获得更多空间)。

  4. 对于只打印事物的功能,您可以更进一步并声明事物const。这是调用者的“保证”(只要你可以保证C中的任何内容)你不会修改数组或其中的字符串:

    void printHistory(const char *const * historyBuff)
    

答案 1 :(得分:1)

<强> 1

malloc分配了许多字节,而不是指针。如果historySize是您要分配的字符指针数,则需要更改:

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

为:

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

<强> 2

您的printHistory()不会更改commandArray指针。您无需传递char***char**即可。