如何实现静态数组初始化的动态等效:
char c[2] = {}; // Sets all members to '\0';
换句话说,创建一个动态数组,其中所有值都初始化为终止字符:
char* c = new char[length]; // how do i amend this?
答案 0 :(得分:102)
char* c = new char[length]();
答案 1 :(得分:30)
两种方式:
char *c = new char[length];
std::fill(c, c + length, INITIAL_VALUE);
// just this once, since it's char, you could use memset
或者:
std::vector<char> c(length, INITIAL_VALUE);
在我的第二种方式中,默认的第二个参数已经是0,所以在你的情况下它是不必要的:
std::vector<char> c(length);
[编辑:投票给Fred的回答,char* c = new char[length]();
]
答案 2 :(得分:17)
也许使用std::fill_n()
?
char* c = new char[length];
std::fill_n(c,length,0);
答案 3 :(得分:6)
new-expression的数组形式只接受一种初始值形式:空()
。这个BTW与非动态初始化中的空{}
具有相同的效果。
以上内容适用于pre-C ++ 11语言。从C ++ 11开始,可以使用带有数组new-expressions
的统一初始化语法char* c = new char[length]{};
char* d = new char[length]{ 'a', 'b', 'c' };
答案 4 :(得分:5)
C ++没有具体功能。但是,如果你使用std :: vector而不是数组(你可能应该这样做),那么你可以指定一个值来初始化向量。
std::vector <char> v( 100, 42 );
创建一个大小为100的向量,所有值都初始化为42。
答案 5 :(得分:3)
你不能轻易地在一行中完成。你可以这样做:
char* c = new char[length];
memset(c, 0, length);
或者,您可以重载新运算符:
void *operator new(size_t size, bool nullify)
{
void *buf = malloc(size);
if (!buf) {
// Handle this
}
memset(buf, '\0', size);
return buf;
}
然后你就可以做到:
char* c = new(true) char[length];
,而
char* c = new char[length];
将保持旧的行为。 (注意,如果您希望所有new
都将他们创建的内容归零,您可以使用上面相同但取出bool nullify
部分来完成此操作。
请注意,如果选择第二个路径,则应该重载标准新运算符(没有bool的运算符)和delete运算符。这是因为您在这里使用的是malloc()
,标准表示malloc()
+ delete
操作未定义。因此,您必须重载delete
以使用free()
,并使用普通新用malloc()
。
在实践中虽然所有实现都在内部使用malloc()/ free(),所以即使你不这样做,你很可能不会遇到任何问题(语言律师对你大吼大叫)
答案 6 :(得分:2)
从c ++ 11开始,我们可以使用list initialization:
char* c = new char[length]{};
对于聚合类型,将执行aggregate initialization,其效果与char c[2] = {};
相同。
答案 7 :(得分:1)
没有内部手段,AFAIK。用这个: memset(c,0,length);
答案 8 :(得分:1)
和许多海报的隐含评论=&gt;不要使用数组,使用向量。数组的所有好处都没有缺点。 PLus你得到很多其他好东西
如果您不了解STL,请阅读Josuttis C ++标准库和meyers有效STL
答案 9 :(得分:0)
你必须“手动”初始化它:
char* c = new char[length];
for(int i = 0;i<length;i++)
c[i]='\0';