错误:无法转换' char(*)[a]' to' char(*)[2]'。我不明白为什么会出现错误

时间:2017-10-04 04:43:36

标签: c arrays dev-c++

在下面的代码中,如果我使用数字代替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 ++。

1 个答案:

答案 0 :(得分:2)

你有三个主要问题。

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

接下来,num完全未初始化。你期望什么打印?尝试读取未初始化的值会调用未定义的行为

最后,printf ("%c\n", a + num[1][1]);中的格式字符串是可疑的。函数名称为displayNumber,但您正在尝试打印字符。此外,如果该值低于' '(空格,例如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]);
}

示例使用/输出

$ ./bin/dispnum
4

仔细看看,如果您有其他问题,请告诉我。

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

我在Win7盒子上有TDM-GCC 4.9.2。它工作正常。这是在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在您的路径中就可以从任何地方编译)