大警告:我通常不会以这种方式处理多维数组。
我试过这个只是为了检查,但是这个:
#include <stdio.h>
int foo(char b[][7])
{
printf("%d\n", b[3][4]);
return 0;
}
int main(int argc, char** argv)
{
char multi_d_arr[20][7];
multi_d_arr[3][4] = 42;
foo(multi_d_arr);
return 0;
}
使用gcc -Wall 编译和运行没有任何问题。老实说,我不确定第二个参数如何被视为不兼容的指针类型。工作正常。
但是,既然您问了,我将如何处理二维数组?更好的方法是使用这样的指针:
char** array2d = malloc((MAX_i+1)*sizeof(char*));
for ( i = 0; i < (MAX_i+1); i++ )
{
array2d[i] = malloc((MAX_j+1)*sizeof(char));
}
现在,为了清楚起见,您可以访问的最大元素是 array2d[MAX_i][MAX_j]。
完成后不要忘记反转过程:
for ( i = 0; i < (MAX_i+1); i++ )
{
free(array2d[i]);
}
free(array2d);
现在,使用这种方法,下标符号仍然有效,所以array2d[x][y] 仍然可以访问正确的值。从字面上看,array2d 是一个指针数组,每个 array2d[i] 也是如此。
为什么这是一个更好的方法?好吧,如果您愿意,您可以拥有可变大小的子数组。您所要做的就是更改 for 循环。这种技术通常用于字符串数组,特别是在应用程序的int main(int argc, char** argv) 签名中。 argv 是一个可变长度字符串数组。使用strlen() 确定它们的长度。
你能把这个传过去吗?当然。对于初学者,您刚刚在 main 中收到它,但您也可以像这样编写函数签名:
int foo(char** ar2d, const unsigned int size);
然后调用它:
char** somearray;
/* initialisation of the above */
foo(ar2d, thesizeofar2d);
/* when done, free somearray appropriately */
需要明确的是,您包含尺寸参数的方法(如const unsigned int size)是非常好的做法,您应该坚持下去。