如何初始化一个char数组?
Posted
技术标签:
【中文标题】如何初始化一个char数组?【英文标题】:how to initialize a char array? 【发布时间】:2010-06-28 17:03:29 【问题描述】:char * msg = new char[65546];
想要将它们全部初始化为 0。在 C++ 中执行此操作的最佳方法是什么?
【问题讨论】:
最好的办法是永远不要像那样手动使用new
。使用std::vector
。
【参考方案1】:
char * msg = new char[65546]();
它被称为值初始化,是在 C++03 中引入的。如果您碰巧发现自己被困在前十年,那么您需要使用std::fill()
(如果您想假装它是 C,则需要使用 memset()
)。
请注意,这不适用于除零以外的任何值。我认为 C++0x 会提供一种方法来做到这一点,但我有点落后于时代,所以我无法对此发表评论。
更新:我对这门语言的过去和未来的思考似乎并不完全准确;请参阅 cmets 进行更正。
【讨论】:
这很好用,因为 0 是char
的默认整数值。
它并不是真正“在 C++03 中引入的”。 ()
初始值设定项也出现在原始 C++98 中。虽然在 C++03 中确实引入了值初始化的概念,但它与这种特定情况无关。 new char[N]()
也是在 C++98 中生成零初始化数组所必需的。
我相信 C++0x 都没有提供将 all 元素初始化为特定值的方法。它允许new char[65546]1, 2, 3
- 但所有剩余元素仍将初始化为0
。
你们对 std::string 或 vector“最 C++”的方法是使用 std::fill
。
std::fill(msg, msg + 65546, 0);
【讨论】:
+1,(相当)类型安全且易于阅读。虽然我更喜欢 &msg[0], &msg[65546] (我也认为 65536 是预期的大小=)【参考方案3】:如果没有很好的理由不这样做,我可能会使用:
std::vector<char> msg(65546, '\0');
【讨论】:
【参考方案4】:什么是最好的方法来做到这一点 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 缓冲区来做任何您想做的事情,但更安全、更灵活,有时甚至更有效(例如,无需重新计算线性字符串长度)。最重要的是,您不必手动释放分配的内存,因为析构函数会为您执行此操作。
【讨论】:
+1 从问题中退后一步,并建议应该如何做。【参考方案5】:此方法使用“C”memset 函数,速度非常快(避免了逐字符循环)。
const uint size = 65546;
char* msg = new char[size];
memset(reinterpret_cast<void*>(msg), 0, size);
【讨论】:
不需要强制转换,C++ 中允许隐式 T* 到 void*,只是不能隐式 void* 到 T* ...更不用说这里的正确演员阵容是static_cast
。
而且std::fill
无论如何都要好得多。任何现代编译器都会尽可能使用memset
,不一致是没有用的。【参考方案6】:
memset(msg, 0, 65546)
【讨论】:
记得#include <cstring>
sizeof(char) 是否保证为 1?我从来没有见过它不是,但除非它得到标准的保证,否则我会使用memset(msg,0,65546*sizeof(char));
来确定。
@Paul: sizeof(char)
保证为 1。
@TommyA: sizeof(char) == 1 根据标准。我没有官方标准的副本,但 C++03 草案标准说,“sizeof(char)、sizeof(signed char) 和 sizeof(unsigned char) 为 1”。 (5.3.3)
@TommyA:我确实有一份标准的副本,它完全符合@Fred 所说的内容。当然,不一定非得是 8 位...【参考方案7】:
您可以使用 for 循环。但不要忘记最后一个字符必须是空字符!
char * msg = new char[65546];
for(int i=0;i<65545;i++)
msg[i]='0';
msg[65545]='\0';
【讨论】:
我很确定 OP 希望数组初始化为全零(又名空值)而不是全部'0'
:-)【参考方案8】:
类 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 的回答也提供了进一步的见解。
【讨论】:
@HJ:已编辑,谢谢。 OP 想要零,如果使用 ASCII '0' 与 Chr(48) 相同? 当您谈论 char 时,“零”这个词是模棱两可的,但它通常表示 null 而不是 ASCII 字符'0'
。我相信 OP 意味着一个空数组而不是一个充满零字符的数组,如果只是因为后者不太可能有用的话。但解释如何做到这两点并不会影响您的回答。
... 除了我认为您的第二个代码片段只会将一个'0'
放入数组中吗?你试过了吗?
@HJ:啊,再次编辑。不是一厢情愿!【参考方案9】:
如果您感到恐慌并且无法在构造函数中将动态数据分配给 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;
【讨论】:
以上是关于如何初始化一个char数组?的主要内容,如果未能解决你的问题,请参考以下文章