【问题标题】:How to pass a full 2D array to a function in C如何将完整的二维数组传递给 C 中的函数
【发布时间】:2020-06-21 08:22:08
【问题描述】:

我需要在函数中使用完整的二维数组。 我不能使用 for、while 或 do-while。 我正在使用适用于 Windows 的 CodeBlocks(C 语言) 这是一个代码示例(这不是真正的代码,只是一个示例):

#include <stdio.h>
void reload(char* reload[2][6])
{
    printf(" _________________\n");
    printf("|%c|%c|%c|%c|%c|%c|\n", array[0][0], array[0][1], array[0][2], array[0][3], array[0][4], array[0][5]);
    printf("|%c|%c|%c|%c|%c|%c|\n", array[1][0], array[1][1], array[1][2], array[1][3], array[1][4], array[1][5]);
    printf(" -----------------\n");
}
int main()
{
    char* array[2][6];
    printf(" _________________\n");
    printf("|%c|%c|%c|%c|%c|%c|\n", array[0][0], array[0][1], array[0][2], array[0][3], array[0][4], array[0][5]);
    printf("|%c|%c|%c|%c|%c|%c|\n", array[1][0], array[1][1], array[1][2], array[1][3], array[1][4], array[1][5]);
    printf(" -----------------\n");
    reload(array);
    return 0;
}

【问题讨论】:

  • 所以你有一个 char* 的二维数组,所以从技术上讲是一个 char***。对于这种情况,固定大小的数组有效(只需检查 Jayram 答案),否则请考虑 malloc 并且不要忘记检查您的参数。
  • @Platypus:char * 的二维数组不是char ***。数组不是指针。
  • @EricPostpischil 那么告诉我你将如何 malloc 一个二维的 char* 数组?
  • @Platypus:char *(*x)[Rows][Columns] = malloc(sizeof *x);char *(*x)[Columns] = malloc(Rows * sizeof *x);
  • @Platypus: 没有。一个char ***可以用三个下标得到一个char或两个下标得到一个char *,但它是一个指向指针的指针;它不是数组数组或数组数组的数组。许多人将它们混为一谈,因为数组在许多表达式中会自动转换为指针,但它们是不同的,因为数组在某些表达式中未转换为指针。在sizeof 和获取地址和声明中出现差异。

标签: c windows function multidimensional-array codeblocks


【解决方案1】:

reload函数的参数名有误;应该是array,而不是reload

#include <stdio.h>
void reload(char* array[2][6])
{
    printf(" _________________\n");
    printf("|%c|%c|%c|%c|%c|%c|\n", array[0][0], array[0][1], array[0][2], array[0][3], array[0][4], array[0][5]);
    printf("|%c|%c|%c|%c|%c|%c|\n", array[1][0], array[1][1], array[1][2], array[1][3], array[1][4], array[1][5]);
    printf(" -----------------\n");
}
int main()
{
    char* array[2][6];
    printf(" _________________\n");
    printf("|%c|%c|%c|%c|%c|%c|\n", array[0][0], array[0][1], array[0][2], array[0][3], array[0][4], array[0][5]);
    printf("|%c|%c|%c|%c|%c|%c|\n", array[1][0], array[1][1], array[1][2], array[1][3], array[1][4], array[1][5]);
    printf(" -----------------\n");
    reload(array);
    return 0;
}

【讨论】:

  • @EricPostpischil 原帖是用这个答案编辑的,检查原帖的未编辑版本,你会发现参数有问题。
  • 这个答案没有帮助,也没有任何意义:您正在打印 pointer 的内容,就好像它是一个字符一样。也就是说,如果我写char* array[2][6]={(void*)0x00000041};,当我在我的小端PC上运行它时,它就会开始打印A
【解决方案2】:
  • 如果您想要 字符 的实际二维数组(即 2 个字符串),那么它很简单:char array[2][6];
  • 在使用之前初始化该数组。例如:char array[2][6] = {"hello", "world"};
  • 相应更改函数,去掉无意义的参数名:
    void reload(char array[2][6]).

然后它会打印:

 _________________
|h|e|l|l|o| |
|w|o|r|l|d| |
 -----------------

假设空终止符的字符表示在您的系统上是“不打印”。

【讨论】:

  • OP 确实声明问题中的代码是一个“示例”,而不是他们的真实代码,并且没有说明他们问的是什么问题。因此,我们不知道他们是在询问由reload 参数名称引起的编译器错误消息,还是由不匹配类型引起的编译器错误消息,或者这些中的一个或两个是由它们的“示例”构造缺陷引起的,他们想问的真正问题是别的。这个问题已经基于第一个前提得到了回答,应该关闭。 OP 应该输入一个新的、结构更好的问题。
【解决方案3】:

这里还有另一个问题:传递指针数组并打印字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 2021-01-11
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多