【发布时间】:2010-06-28 17:03:29
【问题描述】:
char * msg = new char[65546];
想要将它们全部初始化为 0。在 C++ 中执行此操作的最佳方法是什么?
【问题讨论】:
-
最好的办法是永远不要像那样手动使用
new。使用std::vector。
标签: c++ visual-c++
char * msg = new char[65546];
想要将它们全部初始化为 0。在 C++ 中执行此操作的最佳方法是什么?
【问题讨论】:
new。使用std::vector。
标签: c++ visual-c++
char * msg = new char[65546]();
它被称为值初始化,是在 C++03 中引入的。如果您碰巧发现自己被困在前十年,那么您需要使用std::fill()(如果您想假装它是 C,则需要使用 memset())。
请注意,这不适用于除零以外的任何值。我认为 C++0x 会提供一种方法来做到这一点,但我有点落后于时代,所以我无法对此发表评论。
更新:我对这门语言的过去和未来的思考似乎并不完全准确;请参阅 cmets 进行更正。
【讨论】:
char 的默认整数值。
() 初始值设定项也出现在原始 C++98 中。虽然在 C++03 中确实引入了值初始化的概念,但它与这种特定情况无关。 new char[N]() 也是在 C++98 中生成零初始化数组所必需的。
new char[65546]{1, 2, 3} - 但所有剩余元素仍将初始化为0。
“最 C++”的方法是使用 std::fill。
std::fill(msg, msg + 65546, 0);
【讨论】:
如果没有很好的理由不这样做,我可能会使用:
std::vector<char> msg(65546, '\0');
【讨论】:
什么是最好的方法来做到这一点 C++?
因为你是这样问的:
std::string msg(65546, 0); // all characters will be set to 0
或者:
std::vector<char> msg(65546); // all characters will be initialized to 0
如果您正在使用接受 char* 或 const char* 的 C 函数,那么您可以这样做:
some_c_function(&msg[0]);
如果 std::string 接受 const char* 或 data(),您也可以使用 c_str() 方法。
这种方法的好处是,您可以使用动态分配的 char 缓冲区来做任何您想做的事情,但更安全、更灵活,有时甚至更有效(例如,无需重新计算线性字符串长度)。最重要的是,您不必手动释放分配的内存,因为析构函数会为您执行此操作。
【讨论】:
此方法使用“C”memset 函数,速度非常快(避免了逐字符循环)。
const uint size = 65546;
char* msg = new char[size];
memset(reinterpret_cast<void*>(msg), 0, size);
【讨论】:
static_cast。
std::fill 无论如何都要好得多。任何现代编译器都会尽可能使用memset,不一致是没有用的。
memset(msg, 0, 65546)
【讨论】:
#include <cstring>
memset(msg,0,65546*sizeof(char)); 来确定。
sizeof(char) 保证为 1。
您可以使用 for 循环。但不要忘记最后一个字符必须是空字符!
char * msg = new char[65546];
for(int i=0;i<65545;i++)
{
msg[i]='0';
}
msg[65545]='\0';
【讨论】:
'0' :-)
类 C 的方法可能不像这个问题的其他解决方案那样有吸引力,但为了完整起见,在此处添加:
您可以像这样使用 NULL 进行初始化:
char msg[65536] = {0};
或者使用零考虑以下几点:
char msg[65536] = {'0' another 65535 of these separated by comma};
但不要像not possible那样尝试,所以使用memset!
在第二种情况下,如果你想使用 msg 作为字符串,在 memset 之后添加以下内容。
msg[65536 - 1] = '\0'
对this question 的回答也提供了进一步的见解。
【讨论】:
'0'。我相信 OP 意味着一个空数组而不是一个充满零字符的数组,如果只是因为后者不太可能有用的话。但解释如何做到这两点并不会影响您的回答。
'0' 放入数组中吗?你试过了吗?
如果您感到恐慌并且无法在构造函数中将动态数据分配给 const char*,您可以逐个插入动态缓冲区的每个元素。您甚至可以在制作印记之前 snprintf() 到缓冲区。
client_id = new char[26] {
buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],
buf[10],buf[11],buf[12],buf[13],buf[14],buf[15],buf[16],buf[17],buf[18],buf[19],
buf[20],buf[21],buf[22],buf[23],buf[24],'\0'
};
为了掩盖你一直在做的事情,也许编辑器有一个选项,你可以将前景色设置为与背景相同?
在被解雇之前,您实际上可以在头文件声明中为 const char 填充足够的空间,然后在构造函数中分配实际数据。太好了!
const char* client_id = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
它是一个常量指针,在构造函数处理它之前不必初始化。
const char* client_id;
【讨论】: