这个声明非常令人困惑:
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 {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 {new char[1024]{}};
等于
char* q = new char[1024]{};
其结果等同于
char* q = new char[1024] { 0, 0, 0, 0 /* 1020 more zeros */ }
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 Hammamynew
表达式动态分配大小等于1024
的内存(更严格地说,是1024
乘以char
的大小,但标准定义sizeof(char)
为1
)。正如WorldSEnder所指出的,实现可能会分配更多的内存(例如,向系统相关的“块大小”舍入),但您的程序不能依赖于此。 “堆”是/曾经是一些(较旧的)系统内存管理的实现细节,并不反映标准要求或其他系统的情况。最后,一个char
可能不止8位。 - Peter
char *q
是指向char
的指针。 - melpomene