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

C++ 如何在C+;中初始化动态数组+;?,c++,arrays,C++,Arrays,如何实现此静态数组初始化的动态等效: char c[2] = {}; // Sets all members to '\0'; 换句话说,创建一个动态数组,其中所有值都初始化为终止字符: char* c = new char[length]; // how do i amend this? 也许可以用 没有内部手段。使用以下命令: memset(c,0,长度) 你不可能在一行中轻松做到这一点。你可以做: char* c = new char[length]; memset(c, 0, l

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

char c[2] = {};  // Sets all members to '\0';
换句话说,创建一个动态数组,其中所有值都初始化为终止字符:

char* c = new char[length]; // how do i amend this? 
也许可以用


没有内部手段。使用以下命令:
memset(c,0,长度)

你不可能在一行中轻松做到这一点。你可以做:

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];

将保持旧的行为。(注意,如果您希望所有
new
s将它们创建的内容归零,您可以使用上面的相同方法,但去掉
bool nullify
部分)

请注意,如果选择第二条路径,则应重载标准的new运算符(不带bool的运算符)和delete运算符。这是因为这里您使用的是
malloc()
,而标准规定
malloc()
+
delete
操作未定义。因此,要使用
免费()
,您必须重载
删除
,而要使用
malloc()
,则必须重载正常的新代码


实际上,尽管所有实现都在内部使用malloc()/free(),所以即使您不这样做,也很可能不会遇到任何问题(除了语言律师对您大喊大叫)

C++没有特定的功能来实现这一点。但是,如果使用std::vector而不是数组(您可能应该这样做),则可以指定一个值来初始化向量

std::vector <char> v( 100, 42 );
标准向量v(100,42); 创建大小为100的向量,所有值初始化为42。

两种方式:

char *c = new char[length];
std::fill(c, c + length, INITIAL_VALUE);
// just this once, since it's char, you could use memset
或:

std::向量c(长度、初始值);
在我的第二种方法中,默认的第二个参数已经是0,因此在您的情况下,它是不必要的:

std::vector<char> c(length);
std::向量c(长度);

[编辑:投票支持弗雷德的答案,
char*c=new char[length]();
]

和许多海报的隐含评论=>不要使用数组,使用向量。阵列的所有好处都没有缺点。另外,你还可以得到很多其他的好东西

如果你不知道STL,请阅读Josuttis的C++标准库和迈尔斯有效的STL

< P>你必须用“手工”初始化:

char*c=新字符[长度];

对于(int i=0;i新表达式的数组形式只接受一种初始值设定项形式:空的
()
。顺便说一句,这与非动态初始化中的空
{}
具有相同的效果


以上适用于C++11之前的语言。从C++11开始,可以对数组新表达式使用统一的初始化语法

char* c = new char[length]{};
char* d = new char[length]{ 'a', 'b', 'c' };
由于c++11,我们可以使用:


对于聚合类型,则将执行,其效果与
char c[2]={};

相同,但是……您可以看到std::fill/std::fill\n护目镜……它们什么都不做,可能是因为这是一种处理问题的奇怪方式。更规范的解决方案是使用
fill\n
memset
是原始的,
fill\n
更通用,为了保持一致,您可以使用它),一个
vector
,或者上面的快捷0答案。也就是说,您的
操作符new
可以有一些改进。只需使用常规的
操作符new
buf=::操作符new(大小)
。这将自动为您处理所有异常,并且
新的\u处理程序
(假设全局
运算符new
正确执行此操作)哇..这是一个很好的问题。很多人不知道std::fill\n这似乎是个好问题。为了记录在案,我并不是完全不知道
std::fill\n
,只是我基本上忽略了它,只在必要时才使用算法。也就是说,迭代器类型不支持
操作符+
,以及
std::advancede>可能效率低下。这两种情况对指针都不适用。我总是忘记这一点。不适用于任何其他值,但提问者没有要求任何其他值……哇,我以前从未见过。同样,从未见过;你能描述一下这里发生了什么吗?你称之为什么?如何重新定义此arr的大小这个问题是关于C++的,你可以问一个关于C的单独的问题,答案是使用<代码> CaloC 。你可以这样做,但是你不必这样做。上面看到关于STD::fIL.(和):和STD::fILIN()。我是新的CPP,读写<代码> int n;CIN > n;int ARR[n]
是违反cpp标准的。
int n;cin>>n;std::vector c(n);
是否正确遵循标准?只是想知道!!@jay:是的,没关系。但是
std::vector c[n]
是违反标准的。对吗?
std::vector<char> c(length, INITIAL_VALUE);
std::vector<char> c(length);
char* c = new char[length];
for(int i = 0;i<length;i++)
    c[i]='\0';
char* c = new char[length]();
char* c = new char[length]{};
char* d = new char[length]{ 'a', 'b', 'c' };
char* c = new char[length]{};