【发布时间】: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++ 的范围,那么朋友之间的另一种非标准行为形式是什么?