【问题标题】:Can "struct hack" be implemented this way?“struct hack”可以这样实现吗?
【发布时间】:2011-07-24 13:58:37
【问题描述】:

Struck hack 用于分配比结构本身的初始需要更多的内存,以便您可以引用数组的越界部分,以便您留在实际分配的内存中.

这是它的工作原理。

struct Foo
{
  // ..
  size_t size;
  int data[1];
};

const size_t SIZE = 100;
Foo *p = (Foo*) malloc(sizeof(Foo) + sizeof(int) * (SIZE - 1));
p->size = SIZE;
for (int i = 0; i < p->size; ++i) (p->data)[i] = i;

问题:

我们可以只使用一个整数而不是一个大小为 1 的数组吗?如果这是可行的,那么为什么数组大小为一的版本会变得更受欢迎呢?

struct Foo
{
  // ..
  size_t size;
  int data;
};

// ..
for (int i = 0; i < p->size; ++i) (&p->data)[i] = i;

【问题讨论】:

  • 旁注:由于您已经在使用特定于实现的代码(访问数组越界),您可以使用stackoverflow.com/questions/6180012/array-with-size-0 来简化分配调用。
  • 大小为零的数组在 C 和 C++ 中是非法的。不是吗?
  • 正如在其边界之外访问数组一样。如果你通过使用“struct hack”来打破标准,为什么不使用另一个非标准的东西,实际上让“struct hack”更简单?
  • 无法编译 'int data[0]' 而使用 'int data[1]' 可以编译
  • 是的。但是,越界访问数组也是如此。您已经超出了标准 C++ 的范围,那么朋友之间的另一种非标准行为形式是什么?

标签: c++ struct


【解决方案1】:

访问超出其边界的数组是未定义的行为。例如,您的调试器可能决定在数组的每一侧插入金丝雀数组。

明智的做法是使用std::vector,这就是它的用途。 struct hack 是旧的 C 主义,在 C++ 中是多余的。

【讨论】:

  • 一件事是std::vector 强制进行额外分配(这在某些情况下可能是不可取的,例如性能方面)。你知道一种 C++ 方法为结构及其数组只分配一块内存吗?
【解决方案2】:

使用第二个版本,您无法使用漂亮的直接数组 synatx。你做不到

p->data[i]

还有,但必须这样做

(&p->data)[i]

看起来更丑的东西。

【讨论】:

  • 无论如何你都不会在 C++ 中使用它(见标签);您的类数据是通过方法访问的。但是,考虑到像 malloc 这样的 C 主义,问题可能会被错误地标记。
【解决方案3】:

因为写p-&gt;data[i]比写(&amp;p-&gt;data)[i]方便。

【讨论】:

    【解决方案4】:

    因为p-&gt;data[i] 比(&amp;p-&gt;data)[i] 更短且更具可读性。

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 1970-01-01
      • 2019-06-09
      • 2020-03-14
      • 2021-10-24
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2012-10-11
      相关资源
      最近更新 更多