C传递指向指针矩阵的不同方法到函数中

4

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

数组:

*cmd[maxCmdSize][maxArgSize]

功能:

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

如何在不在函数中声明维度大小的情况下实现此操作?
3个回答

3

如何在不声明函数维度大小的情况下实现此目标?

无法省略数组的第二个维度。

因此,您需要将原型设置为:

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

并且像这样调用方法:

performCmd(cmd);

2
使用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的大小可以用*替代。

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

如果没有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支持。


1
VLA支持实际上是C99所必需的。C11将其改为可选,但任何在C11之前存在的良好编译器都支持它们,特别是如果它还具有C99模式。 - cmaster - reinstate monica
@cmaster 感谢您的评论。根据我的经验,gcc和clang都很好地支持这一点,但是tinycc尚未支持参数中的VLA,尽管它在其他地方支持它们。 - Petr Skocik

0
你可能需要传递一个 char 双指针和另外两个维度作为参数。
void performCmd(char** cmd, int maxCmdSize, int maxArgSize) {
  //do whatever this function does
}

2
警告:从不兼容的指针类型传递‘performPipeCmd’的参数1 - Jakub Balicki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接