【问题标题】:Allocate array without specifying size分配数组而不指定大小
【发布时间】:2014-11-16 13:12:02
【问题描述】:

根据 C++ 标准,以下构造是否有效?在此语句之后我可以用 arr 做什么?

char* arr = new char[];

提前致谢。

【问题讨论】:

  • 在所有标准中都无效。语义是什么?
  • 我认为 可以 使其有效的例外是用户定义的新位置,其中用户定义的参数为空;但在这种情况下,你需要传递地址,所以,不。
  • 我想你可能要找的是std::vector
  • @didierc idk,我刚刚在C++项目中看到了这段代码
  • 你试过编译吗?

标签: c++ arrays language-lawyer new-operator


【解决方案1】:

不,这是不允许的。 [expr.new]/1 中 new-expression 的语法规定

noptr-new-declarator:
     [ 表达式 ] attribute-specifier-seq opt
       noptr-new-declarator [ constant-expression ] attribute-specifier-seqopt

很明显,您的代码中的括号之间没有表达式。而且它也没有任何意义:你怎么能分配一个未知长度的数组?

如果需要动态更改大小的数组,请使用std::vector

【讨论】:

【解决方案2】:

C++ 编译器定义了允许声明大小为 0 的数组的扩展。通常它可用于声明结构中的最后一个字段,因此您可以在结构分配期间选择此类数组的长度。

struct A
{
    float something;
    char arr[];
};

所以,如果你想用 let say arr 分配这样的 A 来拥有 7 个元素,你可以这样做:

A* p = (A*)malloc( sizeof(A) + sizeof(char)*7) ;

您应该注意 sizeof(A) 等于 sizeof(float),因此对于编译器,您的 arr 字段的大小为 0。

现在您可以使用最多 7 个索引的 arr 字段:

p->arr[3]='d';

【讨论】:

  • 虽然这个特性在某些实现中确实存在,但这并不是使用new动态分配数组。
猜你喜欢
  • 2011-12-04
  • 2012-04-04
  • 2021-07-13
  • 2018-03-04
  • 2014-11-10
  • 2012-09-15
  • 2021-12-15
  • 2012-03-01
  • 2021-11-14
相关资源
最近更新 更多