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;
答案 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]
更短且更具可读性。