1

当我尝试动态分配一个指向 char 的指针数组时,我不小心添加了额外的括号

  char** p = new (char*) [5];

并且发生了错误

错误:带括号的类型 ID 后禁止数组绑定|

我不明白什么是错的,上面的代码和有什么区别

char** p = new char* [5];

这些括号会改变语义吗?

4

4 回答 4

2

这些括号会改变语义吗?

不,它将语法从有效更改为无效。你不能随便把括号放在任何你喜欢的地方;他们只能放在允许括号的地方,这不是一个。

于 2013-05-14T14:52:40.050 回答
1

类型中的括号可以改变声明的含义;例如,new char * [5]是一个 5 个指向 char 的指针的数组,但char (* a)[5]它是一个指向 5 个 char 的数组的指针。

另一方面,正如编译器发出的信号,您编写的类型声明没有意义。

有关声明的(杂乱)C 语法以及如何解释它们的示例,请参见此处,并参见此处了解 C 声明 <-> 英语转换器。

于 2013-05-14T14:52:50.160 回答
0

我认为您编写代码的方式看起来就像您调用“新”运算符的重载版本,该运算符用于初始化原始内存的位置,例如

   struct point
   {
       point( void ) : x( 0 ), y( 0 ) { }
       int x;
       int y;
   };

   void proc( void )
   {
       point pts[2];
       new( &pts[0] ) point[2];
   }
于 2013-05-14T15:05:14.143 回答
0

这些括号会改变语义吗?

是的,new操作员使用带括号的参数来触发“placement new”——它期望括号中的内容指向原始存储。

您给出new要分配的对象的声明,只是没有名称,并且每个声明都以类型名开头。

// I find "inside-out, right to left" to be a helpful rule

char *a[5];       new char *[5];     // no parens, so array of 5 pointers, to char
char (*a)[5];     new char (*)[5];   // pointer to array, of char

该错误消息并不是编译器发出的更有用的错误消息之一。

于 2013-05-14T16:54:59.680 回答