C:数组初始化需要用大括号括起来的初始化器列表-简单的代码

时间:2019-02-23 07:50:34

标签: c arrays

我是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;
}

2 个答案:

答案 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]);更加有效地输出单个字符