在 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 数组?