【问题标题】:C++ array initialization not workingC++ 数组初始化不起作用
【发布时间】:2010-08-30 18:39:38
【问题描述】:

我正在尝试像这样初始化一个布尔数组:

bool FcpNumberIsOk[MAX_FCPS]={true};

但是当我调试它时,我只看到数组的第一个元素被初始化,其他的都是假的。怎么会这样?我在 ubuntu 10 上使用 Qt,初始化是在方法内的本地数组上完成的。

好的,谢谢你的回答。

【问题讨论】:

    标签: c++ arrays gcc


    【解决方案1】:

    你误会了。您似乎认为任何未提及的元素都会被初始化为与最后一个显式初始化的值相同的值。您提到的最后一个值是true,因此所有其他元素也将初始化为true。我曾经也有同样的信念,但我很快就知道了。

    这不是它的工作原理。任何未提及的元素都会被默认初始化,这对于 bool 意味着 false

    要将所有元素设置为true,请尝试类似std::fill_n

    std::fill_n(FcpNumberIsOk, MAX_FCPS, true);
    

    【讨论】:

      【解决方案2】:

      因为这就是 C++ 中数组初始化的工作方式。如果您没有为每个元素显式指定值,则该元素默认为零(或者,此处为 false)

       bool FcpNumberIsOk[MAX_FCPS]={true, true, true, true /* etc */ };
      

      注意

       bool FcpNumberIsOk[MAX_FCPS];
      

      将所有值设置为 false 随机设置,具体取决于定义的位置。

      【讨论】:

      • 第二个版本是什么时候初始化的?我想只有当你明确地默认初始化包含的类/结构?
      • @jdv,如果您将变量定义为具有静态存储持续时间(本地/类静态,命名空间范围变量),它在程序启动时初始化为零,然后发生其他任何事情。见What does main return?
      【解决方案3】:

      这是预期的行为。第一个元素初始化为指定值,其余元素初始化为默认值0:

      int c[5] = {1};
      
      // 1 0 0 0 0
      for(int i = 0; i < 5; ++i)
        std::cout << c[i] << ' ';
      

      【讨论】:

        【解决方案4】:

        因为你只显式初始化了数组的第一个元素,所以只有第一个元素被初始化,其余的都没有。

        【讨论】:

        • 余数初始化为默认值0。这就是为什么使用int i[10] = {0};对数组进行0初始化是安全的。
        • 实际上所有元素都会被初始化。标准规定所有剩余元素都设置为 0。
        • @meagar 你怎么能说 "int i[10] = {0}" 除了在第一个元素上设置 0 之外还有什么作用。
        • @yan 我很确定他可以这么说,因为这就是定义语言的工作方式。
        • 但是@Yan,默认情况下它 not 已经使用。如果您根本没有给出任何初始化程序,那么数组将(通常)未初始化。该数组可能包含truefalse 的混合,以及根本无效的bool 值。如果您初始化 any 元素,则 C++ 提供了一个 shorthand 来为其余元素提供默认值。这不是零效应。我认为让语言按照你(和我曾经)认为的方式工作是有好处的,但现在改变它为时已晚。那里的代码已经依赖于当前的行为。
        【解决方案5】:

        使用这种语法,您只初始化第一个元素(使用您的值和其他 get default-one [false]),而不初始化其他元素。 您应该使用 int 数组和 memset 或 for 循环来初始化所有元素。

        【讨论】:

        • 实际上所有元素都会被初始化。标准规定所有剩余元素都设置为 0。
        • 我是这个意思。好吧,我的错。
        • memset 在大多数情况下都可以使用,但不可移植。 ::std::fill 更好,可以在 bool 数组上工作,并且在一个好的编译器上它会同样有效。
        • 我在使用 std::copy 和 msvc 上的向量时遇到了不好的体验。所以,为了提高效率,我使用 memcpy 和 memset 函数。它们是 100% 快的。但是,是的,我总是对他们非常小心。
        猜你喜欢
        • 1970-01-01
        • 2015-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多