【问题标题】:Passing a char** into a function by reference通过引用将 char** 传递给函数
【发布时间】:2023-03-08 04:52:01
【问题描述】:

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

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

historySize 是一个全局整数,目前设置为 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);
    }
}

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

printHistory (&commandArray);

就目前而言,一切都编译得很好,但是当程序打印历史记录时,函数会挂在循环中的某个位置,并且不会打印出 char** 中的内容。所以,我的问题是:我是否正确地传递了 commandArray,我是否正确地声明了函数,我是否在函数中以正确的方式取消引用它?

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

-本

【问题讨论】:

    标签: c function reference char dereference


    【解决方案1】:
    1. 要使您的代码按原样工作,您应该像这样取消引用:

      (*historyBuff)[loopIdx]

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

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

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

      void printHistory(char** historyBuff)
      

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

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

      void printHistory(const char *const * historyBuff)
      

    【讨论】:

    • 感谢两位的帮助!该功能现在运行良好。再次,我非常感激。
    【解决方案2】:

    1.

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

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

    到:

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

    2.

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2012-08-05
      • 1970-01-01
      • 2019-09-16
      • 2017-08-12
      • 2012-03-19
      相关资源
      最近更新 更多