由于问题不断变化,我定义:
1:memset( buffer, '\0', sizeof(buffer) );
2a:memset( buffer, '\0', sizeof(char*) * ARRAY_LENGTH );
2b:memset( buffer, '\0', sizeof(char) * ARRAY_LENGTH );
3:memset( buffer, '\0', ARRAY_LENGTH );
如果问题仅仅是“调用的正确方法是什么memset
”而不是“将该数组归零的最佳方法是什么”,那么 2b 或 3 都是正确的。1 和 2a 是错误的。
您可以在 2b 与 3 上进行风格大战:是否包含sizeof(char)
- 有些人将其省略,因为它是多余的(我通常这样做),其他人将其放入以创建一种与相同代码设置的一致性的数组int
。也就是说,即使他们知道大小为 1,他们总是将大小乘以多个元素。一个可能的结论是,对指向的数组进行 memset 的“最安全”方法buffer
是:
std::memset(buffer, 0, sizeof(*buffer) * ARRAY_LENGTH);
如果缓冲区的类型发生变化,此代码仍然正确,当然前提是它继续具有ARRAY_LENGTH
任何类型的元素,并且所有位为零仍然是正确的初始值。
“C++ is not C”程序员钟爱的另一个选择是:
/* never mind how buffer is allocated */
std::fill(buffer, buffer + ARRAY_LENGTH, 0);
如果您关心,您可以自行检查您的编译器是否将其优化为与优化对std::memset
.
char *buffer = new char [ARRAY_LENGTH]();
在实践中很漂亮但在 C++ 中几乎没用,因为你几乎从来没有new
首先分配数组。
std::string buffer(ARRAY_LENGTH, 0);
介绍了一种管理缓冲区的特定方式,这可能是也可能不是您想要的,但通常是。在char buffer[ARRAY_LENGTH] = {0};
某些情况下有很多话要说。