可以通过这种方式实现“struct hack”吗?

时间:2011-07-24 13:58:37

标签: c++ struct

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;

4 个答案:

答案 0 :(得分:8)

访问其范围之外的数组是未定义的行为。例如,您的调试器可能决定在数组的每一侧插入canary数组。

聪明的做法就是使用std::vector,这就是它的用途。 struct hack是一个旧的C-ism,在C ++中是多余的。

答案 1 :(得分:7)

对于第二个版本,您无法使用漂亮的直接阵列synatx。你做不到

p->data[i]

不再需要做

(&p->data)[i]
什么看起来更难看。

答案 2 :(得分:5)

因为写p->data[i](&p->data)[i]更方便。

答案 3 :(得分:2)

因为p->data[i](&p->data)[i]更短且更具可读性。