【问题标题】:Array of 0 elements in struct [duplicate]结构中0个元素的数组[重复]
【发布时间】:2015-12-17 10:18:01
【问题描述】:

在结构中定义具有 0 个元素的数组是否合法,或者编译器允许它作为副作用?例如:

typedef struct _my_str
{
  int    len;
  double total;
  double tax;
  int    items;
  double item_price[0];
} my_struct;

【问题讨论】:

  • 我认为它在 C 中是合法的,但它是 C++ 中的扩展
  • @HappyCoder 在上面的例子中,你可以有可变数量的item_price元素和可变长度结构的数组(通过指针而不是索引处理)。
  • @HappyCoder,主要用例是当您想要一个与少量其他数据密切相关的可变长度数组时,避免将内存管理开销加倍。普通方法将分配结构,包括指向可变长度数组的第二次分配的指针。有效的方法是为结构和数组分配内存。
  • 请注意,零大小数组和 C 特性 灵活的数组成员 之间存在差异。在 C 和 C++ 中都禁止使用零大小的数组。

标签: c++ c


【解决方案1】:
  1. 在 C 中,您可以使用 变量数组成员,但只能作为 struct 的最后一个元素:所以在您的情况下,您可以使用 double item_price[]; 作为最后的 struct元素。但请注意,这样的struct 不能是另一个struct 的成员;甚至不是最终成员。

  2. 在 C++ 中,它在任何情况下都是不合法的。但是std::vectorstd::array 等替代方案就足够了。

【讨论】:

  • std:array 在这种情况下没有做任何有用的事情,并且std::vector 与指向动态数组的指针相比增加了开销,而这个 C 习惯用法的全部意义在于消除与指针相比的开销到动态数组。
【解决方案2】:

GCC 允许 zero length arrays 作为 struct 的最后一个成员。
ISO C99 用灵活的数组成员改变了这一点

typedef struct _my_str
{
  int    len;
  double total;
  double tax;
  int    items;
  double item_price[]; // Flexible array member
} my_struct;  

请注意,这在 C++ 中无效。

【讨论】:

  • 由于问题也被标记为 C++,可能值得一提的是 C++ 不允许这样做。
猜你喜欢
  • 2016-02-18
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 2011-10-11
  • 2013-01-01
  • 2021-09-20
  • 1970-01-01
相关资源
最近更新 更多