Sun Studio 12:C 用户指南

D.1.8 灵活的数组成员

6.7.2.1 结构和联合说明符

也被称为 "struct hack"。允许结构的最后一个成员是长度为零的数组,如 int foo[];。这种结构一般用作访问 malloc 内存的头文件。

例如,在结构 struct s { int n; double d[]; } S; 中,数组 d 是不完整数组类型。对于 S 的该成员,C 编译器不对任何内存偏移进行计数。换句话说,sizeof(struct s)S.n 的偏移相同。

可以像使用任何普通数组成员一样使用 dS.d[10] = 0;

如果没有 C 编译器对不完整数组类型的支持,您将按以下称为 DynamicDouble 的示例所示定义和声明结构:


typedef struct { int n; double d[1]; ) DynamicDouble;

请注意,数组 d 不是不完整数组类型,并且已使用一个成员进行声明。

下一步,声明指针 dd 并分配内存,如下所示:


DynamicDouble *dd = malloc(sizeof(DynamicDouble)+(actual_size-1)*sizeof(double));

然后,将偏移的大小存储在 S.n 中,如下所示:


dd->n = actual_size;

由于编译器支持不完全数组类型,因此您无需使用一个成员声明数组即可达到同样的效果。


typedef struct { int n; double d[]; } DynamicDouble;

如以前一样声明指针 dd 并分配内存,只是不必再从 actual_size 中减去 1:


DynamicDouble *dd = malloc (sizeof(DynamicDouble) + (actual_size)*sizeof(double));

如以前一样将偏移存储在 S.n 中,如下所示:


dd->n = actual_size;