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)是非常好的做法,你应该坚持下去.