将多维数组传递给函数C.

gra*_*lip 3 c multidimensional-array

我在将多维数组传递给C中的函数时遇到问题.在typedef和参数应该是什么.

目前,我的函数def看起来像这样:

int foo(char *a, char b[][7], int first_dimension_of_array);
Run Code Online (Sandbox Code Playgroud)

我声明一个这样的数组:

char multi_D_array[20][7];
Run Code Online (Sandbox Code Playgroud)

当我尝试像这样调用函数时:

foo(d, multi_D_array, 20);
Run Code Online (Sandbox Code Playgroud)

我得到警告,该函数的第二个参数来自不兼容的指针类型.我尝试了很多我在网上看过的变种,但仍然不能正确.此外,当使用GDB时,我发现只传递了2D数组的第一个数组.非常感谢对我所做错误的反馈.

小智 5

大警告:我通常不会这样处理多维数组.

我试过这只是为了检查,但是这个:

#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;
}
Run Code Online (Sandbox Code Playgroud)

使用时编译和运行没有任何问题gcc -Wall.老实说,我不确定如何将第二个参数视为不兼容的指针类型.工作良好.

但是,既然你问,我将如何处理2-D阵列?更好的方法是使用如下指针:

char** array2d = malloc((MAX_i+1)*sizeof(char*));
for ( i = 0; i < (MAX_i+1); i++ )
{
    array2d[i] = malloc((MAX_j+1)*sizeof(char));
}
Run Code Online (Sandbox Code Playgroud)

现在,为了清楚起见,您可以访问的最大元素是array2d[MAX_i][MAX_j].

完成后不要忘记反转过程:

for ( i = 0; i < (MAX_i+1); i++ )
{
    free(array2d[i]);
}
free(array2d);
Run Code Online (Sandbox Code Playgroud)

现在,使用此方法,下标符号仍然有效,因此array2d[x][y]仍然可以访问正确的值.从字面上讲,array2d是一个指针数组,每个指针都是如此array2d[i].

为什么这是一个更好的方法?好吧,如果您愿意,可以使用可变大小的子阵列.您所要做的就是更改for循环.这种技术通常用于字符串数组,特别是在int main(int argc, char** argv)应用程序的签名中.argv是一个可变长度字符串数组的数组.使用strlen()以确定它们的长度.

你能绕过这个吗?当然.你刚刚在main中收到它,对于初学者来说,你也可以像这样编写你的函数签名:

int foo(char** ar2d, const unsigned int size);
Run Code Online (Sandbox Code Playgroud)

并称之为:

char** somearray;
/* initialisation of the above */

foo(ar2d, thesizeofar2d);

/* when done, free somearray appropriately */
Run Code Online (Sandbox Code Playgroud)

为了清楚起见,你的方法包括大小参数(比如const unsigned int size)是非常好的做法,你应该坚持下去.