【问题标题】:Run-time sized array in a c++ structc++ 结构中的运行时大小的数组
【发布时间】:2013-02-17 13:06:22
【问题描述】:

在 C(使用 gcc)中,我曾经有一些数据结构是一个包含一些额外信息的数组:

struct song {
    uint tempo;
    uint key;
    note play[0]; // or play[] depending on compiler flavour
};

Iirc,被称为“灵活数组”(http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html#Zero-Length) 然后我可以在运行时用malloc(sizeof(song)+N*sizeof(note)) 分配一首包含 N 个音符的歌曲。 如果我这次不打算使用向量,也不打算在song 中引入无用的note* 指针,那么g++ 支持到什么程度?

【问题讨论】:

  • “也不要在歌曲中引入无用的音符*指针” - 你逗我。顺便说一句,malloc 是 C,new 是 C++
  • @EdHeal:不正确。 malloc 既是 C 又是 C++。
  • 是的 - 我同意 - 但 mallocnew 不应该混合恕我直言

标签: c++ arrays struct g++ flexible-array-member


【解决方案1】:

Even in C, this is undefined and non-portable。 GCC 故意让您摆脱它,但其他实现可能不会。这是因为您正在访问超出其边界的数组。

This "trick" is precisely as valid in C++ as it is in C。也就是说,您可以随意在 GCC 文档中说它受支持的 GCC 中使用它,但它永远不会是“定义明确、有效的 C++”。

【讨论】:

  • 我依稀记得,由于依赖越界指针访问,在一些广泛使用的 OSS 应用程序中实际上存在一个相当大的错误。这可能看起来安全,但事实并非如此,优化器可以使用一些非常时髦的特技,使此类代码变得危险。
【解决方案2】:

除了使用固定长度或音符之外别无他法* 因为编译器必须知道你的歌曲结构有多长,并且每个结构都有相同的长度。

所以你必须使用注释*或矢量

【讨论】:

  • 我担心这个答案拒绝或错过了灵活数组破解的前提。
猜你喜欢
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 2021-02-03
  • 2016-09-07
  • 2015-06-22
  • 2014-12-09
  • 2015-11-26
  • 2015-02-17
相关资源
最近更新 更多