【问题标题】:C: Array initialization requires a brace-enclosed initializer list - simple codeC:数组初始化需要一个大括号括起来的初始化列表——简单的代码
【发布时间】:2019-02-23 07:50:34
【问题描述】:

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

【问题讨论】:

标签: c arrays


【解决方案1】:

当使用char walk[10][10] = { 0 }; 时,我得到编译器错误“C:数组初始化需要大括号括起来的初始化列表”。

那是你的编译器非常顽固。

有问题的语句是完全合法的 C。它定义了一个名为 walk 的 10x10 二维数组,其中每个元素(100 个)都是 0

要符合您的编译器奇思妙想,请使用以下之一

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

更好(恕我直言)将您的编译器配置为接受合法代码。

godbolt.org accepts your initial code

【讨论】:

    【解决方案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 所说,您的代码是合法的,并且可以使用默认的许可设置按原样编译,但是使用编译器警告来避免愚蠢的错误胜过额外的限制。编译干净且警告级别较高的代码通常具有较少的错误。

    还请注意,您可以通过对memset(walk, '.', sizeof(walk)); 的一次调用来初始化walk,并且您可以使用putchar(walk[row][col]); 更有效地输出单个字符

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-14
      • 2016-12-11
      • 2012-11-21
      • 2021-12-31
      • 2021-07-18
      • 1970-01-01
      • 2013-08-23
      • 2011-05-18
      相关资源
      最近更新 更多