如何初始化一个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++ 方式。 +-0,我认为自己是一位经验丰富的 c++ 程序员,如果没有评论,我将无法理解这一行。请改用 std::fill 或 memset。【参考方案2】:

“最 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 &lt;cstring&gt; 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数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何初始化字符串数组的char指针数组c ++

如何使用 char 文字初始化 char 数组?

c语言byte类型 typedef unsigned char byte[20]; 如何初始化

初始化静态 const char* 数组

C语言 char** p 初始化

java中array如何初始化