为指针数组动态分配数组

时间:2013-05-14 14:47:58

标签: c++

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

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

并发生错误

  

错误:在括号内的type-id |

之后绑定的数组被禁止

我不会放弃了解错误以及上述代码和

之间的区别
char** p = new char* [5];

这些括号是否会改变语义?

4 个答案:

答案 0 :(得分:2)

  

这些括号是否会改变语义?

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

   void proc( void )
   {
       point pts[2];
       new( &pts[0] ) point[2];
   }

答案 3 :(得分:0)

  

这些括号是否改变了语义?

是的,new运算符使用带括号的参数来触发“placement new” - 它期望括号中的内容指向原始存储。

你给new你要分配的对象的声明,只是没有名字,每个声明都以typename开头。

// 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

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