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;
Run Code Online (Sandbox Code Playgroud)
题:
我们可以只使用一个整数而不是一个大小为1的数组吗?如果这是可行的,那么为什么数组大小版本变得更受欢迎呢?
struct Foo
{
// ..
size_t size;
int data;
};
// ..
for (int i = 0; i < p->size; ++i) (&p->data)[i] = i;
Run Code Online (Sandbox Code Playgroud)
访问其边界之外的数组是未定义的行为.例如,您的调试器可能决定在数组的每一侧插入金丝雀阵列.
聪明的做法就是使用a std::vector,这就是它的用途.struct hack是一个旧的C-ism,在C++中是多余的.
对于第二个版本,您无法使用漂亮的直接阵列synatx.你做不到
p->data[i]
Run Code Online (Sandbox Code Playgroud)
不再需要做了
(&p->data)[i]
Run Code Online (Sandbox Code Playgroud)
什么看起来更难看.