如何初始化char数组?

5Yr*_*DBA 37 c++ visual-c++

char * msg = new char[65546];
Run Code Online (Sandbox Code Playgroud)

想要为所有人初始化为0.在C++中执行此操作的最佳方法是什么?

Mik*_*our 61

char * msg = new char[65546]();
Run Code Online (Sandbox Code Playgroud)

它被称为值初始化,并在C++ 03中引入.如果你碰巧发现自己被困在前十年,那么你需要使用std::fill()(或者memset()如果你想假装它是C).

请注意,这不适用于零以外的任何值.我认为C++ 0x会提供一种方法来做到这一点,但我有点落后于时代,所以我不能对此发表评论.

更新:似乎我对语言的过去和未来的反思并不完全准确; 请参阅更正的评论.

  • 它并没有真正"在C++ 03中引入".`()`初始化程序也出现在原始的C++ 98中.虽然在C++ 03中确实引入了值初始化的概念,但它与此特定情况无关.`new char [N]()`也是在C++ 98中生成零初始化数组所必需的. (4认同)
  • 你们对std :: string或vector <char>过敏了吗?我认为在这些替代方案中使用堆分配的char缓冲区没什么意义,因为用户要求最好的C++方式,所以没有必要鼓励. (4认同)
  • + -0,我认为自己是一位经验丰富的c ++程序员,如果没有评论,我就不会理解这一行.请改用std :: fill或memset. (3认同)
  • 我相信 C++0x 都没有提供将 *all* 元素初始化为特定值的方法。它允许 `new char[65546]{1, 2, 3}` - 但所有剩余的元素仍将被初始化为 `0`。 (2认同)

Pet*_*der 16

"大多数C++"的方法是使用std::fill.

std::fill(msg, msg + 65546, 0);
Run Code Online (Sandbox Code Playgroud)


Jer*_*fin 15

没有一个非常好的理由不这样做,我可能会使用:

std::vector<char> msg(65546, '\0');
Run Code Online (Sandbox Code Playgroud)

  • +1,因为用户要求最好的C++方式.:-D (6认同)

sti*_*472 9

在C++中执行此操作的最佳方法是什么?

因为你这样问:

std::string msg(65546, 0); // all characters will be set to 0
Run Code Online (Sandbox Code Playgroud)

要么:

std::vector<char> msg(65546); // all characters will be initialized to 0
Run Code Online (Sandbox Code Playgroud)

如果您正在使用接受char*或const char*的C函数,那么您可以:

some_c_function(&msg[0]);
Run Code Online (Sandbox Code Playgroud)

如果它接受const char*或data(),你也可以在std :: string上使用c_str()方法.

这种方法的好处是,您可以使用动态分配的char缓冲区执行所有操作,但更安全,更灵活,有时甚至更高效(避免需要线性重新计算字符串长度,例如).最重要的是,您不必释放手动分配的内存,因为析构函数将为您执行此操作.

  • +1从问题中退一步并建议应该如何完成. (2认同)

Ste*_*idi 6

此方法使用' C'memset函数,并且速度非常快(避免使用char-by-char循环).

const uint size = 65546;
char* msg = new char[size];
memset(reinterpret_cast<void*>(msg), 0, size);
Run Code Online (Sandbox Code Playgroud)

  • 不需要强制转换,在c ++中允许隐式T*到void*,只是没有隐式void*到T* (10认同)
  • ...更不用说这里适当的演员阵容是`static_cast`. (7认同)

Eri*_*lje 5

memset(msg, 0, 65546)
Run Code Online (Sandbox Code Playgroud)

  • @Paul:`sizeof(char)`保证为1. (9认同)
  • @TommyA:sizeof(char)== 1根据标准.我没有官方标准的副本,但C++ 03草案标准说,"sizeof(char),sizeof(signed char)和sizeof(unsigned char)是1." (5.3.3) (6认同)
  • @TommyA:我确实有一份标准副本,它正是@Fred所说的.当然,它不一定是8位...... (4认同)