我刚刚遇到一些在C ++类中声明结构的代码,如下所示:
struct T
{
int data;
T* next;
} array[0];
这种声明有什么作用?将“array [0]”放在结构定义的末尾会有什么影响?
答案 0 :(得分:3)
啊,它几乎是一个“灵活的阵列成员”。
它在C99中正式化,但它是一个创建动态数组的旧C技巧。为对象分配更多内存,您可以在数组中存储更多元素。
我认为使用特定的0
存在折衷,因为实际的[]
灵活数组不在C89或C ++中。这种模式的规范遗留使用更为...[1]
。
答案 1 :(得分:1)
这意味着,结构定义仅在该类中可用。
答案 2 :(得分:1)
尝试声明类型T
和大小为零T
的数组。但是,在C ++中声明零大小的数组是不合法的。该代码无效。
答案 3 :(得分:1)
在某些编译器中,如GCC,zero length array是使用[]
表示法声明的灵活类/结构成员的同义词。
答案 4 :(得分:0)
不确定是否是这种情况,但是:
当一个结构必须包含一个可变长度的C字符串(在初始化后不会改变),那么而不是写:
struct x {
int key;
const char* s;
};
当我们需要两个malloc
时(一个用于struct,一个用于字符串),我们可以写
struct X2 {
int key;
char s[1];
}x2;
// and use it like
x2* tmp = (x2*)malloc(sizeof(x2) + strlen(str));
这里我们只有一个malloc
,结构和字符串。
当结构的最后一个属性是一个数组时,那么通过为结构分配变量空间,我们可以用可变数量的这样的成员分配它。我想这会发生在你的情况下。
答案 5 :(得分:0)
众所周知,它是c struct hack,但是当你使用它时take care