代码之家  ›  专栏  ›  技术社区  ›  jgottula

C静态数组初始化-我需要多详细?

  •  7
  • jgottula  · 技术社区  · 15 年前

    要使用全零初始化int数组,是否需要使用:

    int foo[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    

    或者,这是否有效:

    int foo[10] = {0};
    
    4 回复  |  直到 15 年前
        1
  •  27
  •   Kobi    7 年前

    在C/C++中,如果仅使用值初始化已知大小数组的第一个元素,则剩余元素将被零填充,因此:

    int foo[10] = {0};
    

    你想干什么就干什么。

    这也适用于结构:

    struct bar {
        int x;
        int y;
        char c;
    } myBar = {0};
    

    如果大括号内的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文本中的字符少于数组中的元素,则聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。

    在C++中,语法特别允许“{}”初始化器,因此下面也将初始化数组:

    int foo[10] = {};
    

    也可能值得注意的是,在C++中,初始化列表中没有特定的初始化值的条目将是“值初始化”或“默认初始化”,这可能与零初始化不同,这取决于变量类型的构造函数是什么,编译器是否遵循C++ 98标准。或者C++03标准(这可能是C++98和C++03之间唯一有意义的区别)。值与默认初始化的整个情况相当复杂,因此如果您感兴趣,请查看以下答案: Do the parentheses after the type name make a difference with new? .

        2
  •  18
  •   Robert Cartaino    15 年前
    int foo[10] = {0};
    

    这很好:)


    请注意,如果执行以下操作:

    int foo[10] = {1};
    

    只有数组的第一个元素将用非零数初始化,而其余元素将用零初始化。

        3
  •  0
  •   nos    15 年前

    在适用的情况下,初始化器中未提及的所有元素将被初始化为该类型的零值。

    sointfoo[10]={0};很好,未提及的其余元素也将为0

        4
  •  0
  •   DigitalRoss    15 年前

    哇,C似乎很简单,但即使在引用了多年的规范之后,仍然可以发现一些新的东西,这是令人惊讶的。

    我只是在第一版规范(ANSI/ISO 9899-1990)中查找了它,果然,自动聚合的剩余部分是指定的(6.5.7)“如果有更少的…隐式初始化…”。

    所以:任何非自动的东西。无论是否初始化,始终为0(或初始化时)。