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

Sam*_*amy 20 c++ pointers initializer-list

这个声明很混乱:

char* q {new char[1024]{}}; // q[i] becomes 0 for all
Run Code Online (Sandbox Code Playgroud)

这是"指向char数组的char指针" 还是" 指针数组"?

我认为这new char[1024]{}是初始化一个char1024个元素的数组,每个元素的值为0.

所以这和:

char* q = [0,0,....] // until 1024
Run Code Online (Sandbox Code Playgroud)

正确?

Tim*_*mbo 28

char* q {new char[1024]{}};
Run Code Online (Sandbox Code Playgroud)

等于

char* q = new char[1024]{};
Run Code Online (Sandbox Code Playgroud)

反过来等于

char* q = new char[1024] { 0, 0, 0, 0 /* 1020 more zeros */ }
Run Code Online (Sandbox Code Playgroud)


Pet*_*ter 22

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

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

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

它不一样

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

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

char* q = {0,0,....}; //  1024 zeros in initialiser
Run Code Online (Sandbox Code Playgroud)

因为q是一个指针,不能初始化为一组值.它((净)效果更接近

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

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

  • @SamHammamy(过于)正确的说法是"具有至少1024个可寻址内存单元的内存已经分配了operator new"."至少"因为编译器可能为数组分配更多内存,`可寻址内存单元',因为`char`定义了最小的可寻址内存单元,并且以位为单位计数是次要的.`operator new`,因为标准不能识别堆.在普通机器上,这与您所说的相同 (3认同)