在 C++ 中合理地初始化 char 数组?

Posted

技术标签:

【中文标题】在 C++ 中合理地初始化 char 数组?【英文标题】:Init char array sensibly in C++? 【发布时间】:2016-01-11 20:52:29 【问题描述】:

我有一个类,一个结构体,其成员变量类型为std::array<char, 100>,称为charArray。我想明智地初始化这个数组。使用哪些值来初始化数组是明智的,最好的方法是什么?

我想我可以在构造函数中使用std::fill(),但我真的应该这样做吗?我的意思是因为初始化与分配?

谢谢。

【问题讨论】:

【参考方案1】:

一个简单的解决方案是将数组初始化为类型的默认值。举个例子

struct Foo

    std::array<int, 10> bar;
    Foo() : bar() 
;

这里bar 将被初始化为全0。你可以比较一下

struct Bar

    std::array<int, 10> baz;
;

默认会初始化baz,并且它的元素会有一个不确定的值。您可以看到所有这些都在使用

struct Foo

    std::array<int, 10> bar;
    Foo() : bar() 
;

struct Bar

    std::array<int, 10> baz;
;


int main()
    Foo foo;
    for (auto e : foo.bar)
        std::cout << e << " ";
    std::cout << std::endl;
    Bar bar;
    for (auto e : bar.baz)
        std::cout << e << " ";

可能的输出:

0 0 0 0 0 0 0 0 0 0 
-917263728 4197632 4197632 4197632 4197632 4197632 6295552 0 4197581 0 

Live Example

【讨论】:

你的意思是“baz”元素会有一个in行列式值吗? @PeterA.Schneider 错字已修复。感谢您发现它。 @PeterA.Schneider 我不确定阅读它们是否是 UB。 它有点隐藏,但 2011 标准中的 4.1 进行任何“左值到右值”转换(这必须发生在迭代器和操作员调用屏幕后面的 bar.baz 元素的某处)未定义的行为“如果对象未初始化”。 DR 616 不会更改自动变量的设置。原因必须是具有“未初始化”标志的架构或寄存器中的直接陷阱表示。 @PeterA.Schneider 但是由于数组值得到默认初始化,这仍然算数吗?

以上是关于在 C++ 中合理地初始化 char 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 中的 char 指针初始化 char 数组?

C++11 字符数组初始化和字符串字面量

c ++初始化类的char数组成员

具有 char 数组的 C++ 结构以不寻常的方式初始化为零

如何初始化一个char数组?

menset()在c++中的作用