c - 将多维数组传递给函数 C

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

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

int foo(char *a, char b[][7], int first_dimension_of_array);

我这样声明一个数组:

char multi_D_array[20][7];

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

foo(d, multi_D_array, 20);

我收到警告,该函数的第二个参数来自不兼容的指针类型。我已经尝试了很多我在网上看到的变体,但仍然无法得到正确的结果。此外,在使用 GDB 时,我发现只传入了二维数组的第一个数组。非常感谢对我做错了什么的反馈。

最佳答案

重要警告:我通常不会以这种方式处理多维数组。

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

#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)是非常好的做法,您应该坚持使用。

https://stackoverflow.com/questions/4742725/

相关文章:

.net - 如何拦截自定义处理的 WPF 绑定(bind)

tfs-power-tools - TFS Powertools 2010 Shell 与 Wind

.net - SqlCE 4.0 在 Visual Studio 2010 中是否有自己的连接提供程

security - 编写自动更新客户端时我必须担心哪些安全问题?

scala - 提升 Web 框架 DRY 调度

task - Guice:提供程序中的注入(inject)器

.net - 如何从带有procdump(或类似文件)的.Net应用程序中捕获未处理的异常?

java - 尝试执行 jar 时出现错误 java.lang.ClassNotFoundExcep

recursion - 对于每个递归算法都可以创建等效的非递归版本吗?

oop - [incr Tcl] 中的静态函数继承