如何在C ++中初始化动态数组?

时间:2010-01-08 18:10:26

标签: c++ arrays

如何实现静态数组初始化的动态等效:

char c[2] = {};  // Sets all members to '\0';

换句话说,创建一个动态数组,其中所有值都初始化为终止字符:

char* c = new char[length]; // how do i amend this? 

10 个答案:

答案 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';