我是C语言的完整入门者,遇到了我认为是一个简单错误的问题。我在线上查找了类似的问题,但是我的代码找不到问题。几乎没有,我不知道问题是什么。
这是错误:
C: Array initialization requires a brace-enclosed initializer list
这是我完整的代码
#include <stdio.h>
int main() {
char walk[10][10] = { 0 };
for (int row = 0; row < 10; row++) {
for (int col = 0; col < 10; col++) {
walk[row][col] = '.';
printf("%c", walk[row][col]);
}
}
getchar();
return 0;
}
答案 0 :(得分:3)
使用
char walk[10][10] = { 0 };
时出现编译器错误“ C:数组初始化需要用大括号括起来的初始化器列表”。
那是您的编译器非常保留肛门的能力。
所讨论的语句完全是合法的C。它定义了一个名为walk
的char的10x10 2-D数组,其中每个元素(共100个)都是0
。 / p>
要遵循您的编译器要求,请使用以下一种方法
char walk[10][10] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* ..., */ { 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
char walk[10][10] = { { 0 }, { 0 } };
char walk[10][10] = { { 0 } };
char walk[10][10] = { 0 }; // initial statement wrongly rejected by compiler
更好(IMHO)将配置您的编译器以接受合法代码。
godbolt.org accepts your initial code
答案 1 :(得分:2)
您在启用额外警告的情况下编译代码,这是个好主意。
编译器坚持要求您使用具有相同结构的初始化程序初始化数组数组。您可以尝试char walk[10][10] = { { 0 } };
。
在编译器指示没有足够的初始化程序的情况下,您可能具有更为严格的设置。完整的初始化程序将是:
char walk[10][10] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
};
或更紧凑的版本:
char walk[10][10] = { "", "", "", "", "", "", "", "", "", "" };
但是查看您的代码,walk
根本不需要初始化程序,因为您将所有条目都设置在声明的正下方:
#include <stdio.h>
int main() {
char walk[10][10];
for (int row = 0; row < 10; row++) {
for (int col = 0; col < 10; col++) {
walk[row][col] = '.';
printf("%c", walk[row][col]);
}
}
getchar();
return 0;
}
PS:正如 pmg 所说,您的代码是合法的,可以使用默认的允许设置进行编译,但是使用编译器警告来避免愚蠢的错误会超出额外的约束。可以以高警告级别进行干净编译的代码通常具有较少的错误。
请注意,您可以通过一次调用walk
来初始化memset(walk, '.', sizeof(walk));
,并且可以使用putchar(walk[row][col]);
更加有效地输出单个字符