【发布时间】:2020-03-19 13:14:50
【问题描述】:
我想将这个二维指针数组传递给一个函数:
数组:
*cmd[maxCmdSize][maxArgSize]
功能:
void performCmd(char *cmd[maxCmdSize][maxArgSize])
如何在函数中不声明尺寸大小的情况下实现这一点?
【问题讨论】:
标签: c arrays pointers multidimensional-array
我想将这个二维指针数组传递给一个函数:
数组:
*cmd[maxCmdSize][maxArgSize]
功能:
void performCmd(char *cmd[maxCmdSize][maxArgSize])
如何在函数中不声明尺寸大小的情况下实现这一点?
【问题讨论】:
标签: c arrays pointers multidimensional-array
如何在函数中不声明维度大小的情况下实现这一点?
您不能省略数组的第二维。
所以你需要有这样的原型:
void performCmd(int *cmd[][maxArgSize]);
并像这样调用方法:
performCmd(cmd);
【讨论】:
使用 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 支持。
【讨论】:
您可能必须传递一个 char 双指针,并将两个维度作为其他参数。
void performCmd(char** cmd, int maxCmdSize, int maxArgSize) {
//do whatever this function does
}
【讨论】: