在下面的代码中,如果我使用数字代替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]);
}
为什么使用a
或2
会有所作为?我有一种感觉,原因可能是微不足道的,但如果有人帮助的话会非常棒。我使用的IDE是Dev C ++。
答案 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
在您的路径中就可以从任何地方编译)