我在使用new[]
运算符时遇到问题,而在创建指向char
的指针数组时。由于char*
是我想要的元素类型,我使用括号来包围它,但它不起作用:
char **p = new (char *)[vector.size()];
但当我摆脱括号时,它起作用:
char **p = new char *[vector.size()];
为什么后者有效?
答案 0 :(得分:2)
char *p = new char[10];
为大小为10个字符的数组动态分配一个内存块,并返回其第一个元素的地址,然后将其存储到p
中(使p
指向这个记忆块的开头)。
在这种情况下,new
关键字后跟数组类型说明符,您指定类型:
char **p = new char*[10];
- 此案例的类型为char*
,而不是(char*)
。查看operator new[]
您可能会因为C风格的malloc
语法而感到困惑,其返回值的类型始终为void*
,可以将其转换为其他类型,以便您可以取消引用它。这就是你使用(char*)
语法(C风格类型转换)的情况:char *p = (char*) malloc(10);
虽然注意到在C中这个演员阵容是多余的:Do I cast the result of malloc?
请注意,应使用new[]
释放使用delete[]
分配的内存,malloc
分配的内存应由free
释放。
答案 1 :(得分:1)
这是“声明跟随使用”的结果。 char **p;
可以理解为“如果我取消引用p两次,我会得到char
”。 (char*) *p
左侧没有类型,并被解析为表达式,意思是:“取消引用p
并将结果转换为指向char
的指针。”
当char **
单独用作类型名称时,类似的约定成立。 (char*) *
根本不解析为类型名称,而是作为表达式解析(因为左侧没有类型)。