声明和初始化混淆

20

这个声明非常令人困惑:

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

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

我认为 new char[1024]{} 初始化了一个具有 1024 个元素,每个元素都具有值 0 的 char 数组。

因此,这与以下内容相同:

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

正确吗?


char *q 是指向 char 的指针。 - melpomene
2个回答

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

等于

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

其结果等同于

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

22

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

使用表达式new char[1024]{}初始化它,该表达式动态分配一个char数组并将它们初始化为零。如果分配失败,将抛出异常。

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

它与以下语法无关:

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

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

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');

唯一不同的是字符被初始化为零,而不是先未初始化然后再用零覆盖(当然,编译器如何初始化字符是由它决定的)。


谢谢!解释得非常好!我现在明白了,p只是指向第一个元素的地址。可以这样说吗,堆上已经预留了1024个“8位内存块”(不确定术语是否正确),并且已经初始化为0 - Sam Hammamy
3
“@SamHammamy 过于严谨的说法应该是:“使用 operator new 分配了至少 1024 个可寻址内存单元的内存”。这里的‘至少’表示编译器可能会为数组分配更多的内存,‘可寻址内存单元’是因为 ‘char’ 定义了最小的可寻址内存单元,而以位计算是次要的。‘operator new’ 是因为堆不被标准所认可。在一般的机器上,这与你刚才说的是一样的。” - WorldSEnder
1
@SamHammamy - 我不会说那是完全正确的。new表达式动态分配大小等于1024的内存(更严格地说,是1024乘以char的大小,但标准定义sizeof(char)1)。正如WorldSEnder所指出的,实现可能会分配更多的内存(例如,向系统相关的“块大小”舍入),但您的程序不能依赖于此。 “堆”是/曾经是一些(较旧的)系统内存管理的实现细节,并不反映标准要求或其他系统的情况。最后,一个char可能不止8位。 - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接