0

在创建new[]指向char. 由于char*是我希望元素的类型,因此我使用括号将其括起来,但它不起作用:

char **p = new (char *)[vector.size()];

但是当我去掉括号时它会起作用:

char **p = new char *[vector.size()];

为什么后一种有效?

4

2 回答 2

2

char *p = new char[10];为大小为 10 个字符的数组动态分配内存块,并返回其第一个元素的地址,然后将其存储到其中pp指向该内存块的开头)。

在这种情况下,new关键字后跟一个数组类型说明符,您指定类型
char **p = new char*[10];- 在这种情况下,类型是char*,不是(char*)。检查运算符 new[]

您可能会因为 C 风格的malloc语法而感到困惑,其中返回值的类型总是void*,可以将其转换为不同的类型,以便您可以取消引用它。这就是您使用(char*)语法(C 风格类型转换)的情况:char *p = (char*) malloc(10);
虽然请注意在 C 中这种转换是多余的:我是否转换 malloc 的结果?

请注意,使用分配的内存new[]应通过调用释放,delete[]分配的内存malloc应由 释放free

于 2012-05-29T08:40:37.557 回答
1

这是“声明遵循使用”的结果。char **p;可以读作“如果我取消引用 p 两次,我将得到一个char”。(char*) *p左边没有类型,并被解析为表达式,意思是:“取消引用p并将结果转换为指向char”的指针。

char **单独用作类型名称时,类似的约定成立。(char*) *根本不解析为类型名称,而是解析为表达式(因为左侧没有类型)。

于 2012-05-29T08:40:38.567 回答