【问题标题】:C Different method of passing matrix of pointers to functionC将指针矩阵传递给函数的不同方法
【发布时间】:2020-03-19 13:14:50
【问题描述】:

我想将这个二维指针数组传递给一个函数:

数组:

*cmd[maxCmdSize][maxArgSize]

功能:

void performCmd(char *cmd[maxCmdSize][maxArgSize])

如何在函数中不声明尺寸大小的情况下实现这一点?

【问题讨论】:

    标签: c arrays pointers multidimensional-array


    【解决方案1】:

    如何在函数中不声明维度大小的情况下实现这一点?

    不能省略数组的第二维。

    所以你需要有这样的原型:

    void performCmd(int *cmd[][maxArgSize]);
    

    并像这样调用方法:

    performCmd(cmd);
    

    【讨论】:

      【解决方案2】:

      使用 VLA 参数(VLA,即可变长度数组,是 C11 的可选标准扩展),您可以 将大小作为另一个参数传递(需要在 VLA 之前)。

      最里面的索引,数组衰减到一个指针(函数参数中的int *cmd[][maxArgSize]相当于int *(*cmd)[maxArgSize])不需要传递,不会影响基于多维数组的指针运算。

      int performCmd(int maxArgSize, char *cmd[][maxArgSize]);
      int performCmd(int maxArgSize, char *cmd[][*]); //compatible alternative declaration
      
      
      int performCmd(int maxArgSize, char *cmd[][maxArgSize])
      {
          return &cmd[1][0]-&cmd[0][0]; //returns maxArgSize
      }
      

      同样在声明(但不是定义)中,VLA 大小可以替换为*

      (那么在定义中,大小也可以是任何非常量表达式(可能包括函数调用),不一定只是简单的变量引用。)

      如果没有 VLA 支持,您可以简单地将指针传递给基本类型和维度,然后使用它来模拟基本数组上的多维指针运算。

      给定,例如char x[2][3][4][5];&x[1] 表示(char(*)[3][4][5])x + 1,(即(char*)x+1*(3*4*5)),&x[1][1] 表示(char (*)[4][5])((char(*)[3][4][5])x+1) + 1(即(char*)x+1*(3*4*5)+1*(4*5))等。数组维度是动态的,然后您可以使用此数学将动态维度、基指针和一组索引转换为偏移量,而无需依赖 VLA 支持。

      【讨论】:

      • C99 中实际上需要 VLA 支持。 C11 将其更改为可选,但在 C11 支持它们之前已经存在的任何体面的编译器,尤其是如果它也具有 C99 模式。
      • @cmaster 感谢您的评论。根据我自己的经验,gcc 和 clang 很好地支持了这一点,但是 tinycc 还没有在参数上支持 VLA,尽管它在其他地方支持它们。
      【解决方案3】:

      您可能必须传递一个 char 双指针,并将两个维度作为其他参数。

      void performCmd(char** cmd, int maxCmdSize, int maxArgSize) {
        //do whatever this function does
      }
      

      【讨论】:

      • 导致:警告:从不兼容的指针类型传递“performPipeCmd”的参数 1
      猜你喜欢
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 2012-02-22
      相关资源
      最近更新 更多