Error: Cannot convert 'char(*)[a]' to 'char(*)[2]'. I don't understand why there's an error

Error: Cannot convert 'char(*)[a]' to 'char(*)[2]'. I don't understand why there's an error

在下面的代码中,如果我使用一个数字而不是 a,它就可以正常工作。但是如果我使用 a 它会给出以下错误:

Cannot convert 'char(*)[a]' to 'char(*)[2]' for argument '2' to 'void displayNumbers(int, char(*)[2])'

#include <stdio.h>
void displayNumbers(int,char num[2][2]);
int main()
{
    int a=2;
    char num[a][a];// if i write 2 instead of a, it works fine!
    displayNumbers(a,num);
    return 0;
}

void displayNumbers(int a,char num[2][2])
{
    printf("%c\n",a+ num[1][1]);
}

为什么使用 a2 会有所不同?我有一种感觉,原因可能微不足道,但如果有人提供帮助,那就太好了。 IDE 我使用的是 Dev C++。

你有三个主要问题。

首先声明 displayNumber 硬编码 num[2][2] 违背了使用 可变长度数组 的目的(变量 部分名称有问题)。虽然 num[2][2] 有效,但最好写成 num[a][a],或者最好写成 (num*)[a](指向 char [a] 数组的指针)

接下来,num完全未初始化。您希望打印什么?尝试读取未初始化的值会调用 Undefined Behavior.

最后,printf ("%c\n", a + num[1][1]); 中的格式字符串值得怀疑。函数名称是 displayNumber,但您正试图打印一个 字符 。此外,如果该值低于 ' '(space,例如 0x20、32),则不会打印任何内容,您将处于 Non-Printiable 范围内。如果要打印数字,请使用 "%d" 格式说明符 .

总而言之,您可以执行类似以下操作:

#include <stdio.h>

void displayNumbers (int a, char (*num)[a]);

int main (void) {

    int a=2;
    char num[a][a];

    for (int i = 0; i < a; i++)
        for (int j = 0; j < a; j++)
            num[i][j] = i + j;

    displayNumbers (a, num);

    return 0;
}

void displayNumbers (int a, char (*num)[a])
{
    printf ("%d\n", a + num[1][1]);
}

例子Use/Output

$ ./bin/dispnum
4

检查一下,如果您还有其他问题,请告诉我。


在 TDM-GCC 4.9.2 上编译和使用的示例

我在 Win7 机器上安装了 TDM-GCC 4.9.2。它工作正常。这是版本,编译和 运行 on Windows 7:

C:\Users\david\Documents\dev\src-c\tmp>gcc --version
gcc (tdm-1) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

C:\Users\david\Documents\dev\src-c\tmp>gcc -Wall -Wextra -pedantic -Ofast -std=gnu11 -o bin\dispnum dispnum.c

C:\Users\david\Documents\dev\src-c\tmp>bin\dispnum
4

(我留下了完整的目录和路径信息作为示例,只要 gcc.exe 在您的路径中,您就可以从任何地方编译)