Linux上可用的C编译器是GNU C编译器,GNU C允许使用零长度数组,在定义变长对象的头结构时,这个特性非常有用。例如:
struct var_data {
int len;
char data[0];
};
char data[0]仅意味着程序中通过 var_data结构体实例的 data[index]成员可以访问len之后的第index个地址,它并没有为data[]数组分配内存,因此sizeof(struct var_data)=sizeof(int)。
假设struct var_data的数据域就保存在struct var_data紧接着的内存区域中,则通过如下代码可以遍历这些数据:
struct var_data s;
...
for (i = 0; i < s.len; i++)
printf("%02x", s.data[i]);
GNU C中也可以使用1个变量定义数组,例如如下代码中定义的“double x[n]”:
int main (int argc, char *argv[])
{
int i, n = argc;
double x[n];
for (i = 0; i < n; i++)
x[i] = i;
return 0;
}