令人困惑的声明和初始化程序

时间:2017-11-12 13:00:17

标签: c++ pointers initializer-list

这个声明非常令人困惑:

char* q {new char[1024]{}}; // q[i] becomes 0 for all

这是“指向char数组的指针”还是“char指针数组”?

我认为new char[1024]{}正在初始化一个包含1024个元素的char数组,每个元素的值都为0

所以这与:

相同
char* q = [0,0,....] // until 1024

正确?

2 个答案:

答案 0 :(得分:28)

char* q {new char[1024]{}};

等于

char* q = new char[1024]{};

又等于

char* q = new char[1024] { 0, 0, 0, 0 /* 1020 more zeros */ }

答案 1 :(得分:22)

q是指向char的指针。换句话说,它的类型为char *

使用表达式new char[1024]{}对其进行初始化,该表达式动态分配char数组并对其进行零初始化。如果失败,将抛出异常。

q将指向动态分配的数组中的第一个char。它不是一个数组。

不一样
  

char * q = [0,0,....] //直到1024

因为那是无效的语法。它也不等同于

char* q = {0,0,....}; //  1024 zeros in initialiser

因为q是一个指针,无法初始化为一组值。它((净)效果更接近

char *q = new char[1024];     //  dynamically allocates chars uninitialised here
std::fill(q, q + 1024, '\0');

除了将字符初始化为零,而不是首先未初始化然后用零覆盖(当然,由编译器决定如何初始化字符)。