C99 提供一个成为 伸缩性数组成员 的特性。利用这一特性可以声明结构体的最后一个成员具有特殊的属性。 该数组成员的特性:
1. 该成员可存在,也可不存在,当不存在时,并不占用结构体大小。2. 使用这个伸缩的成员,使它可以具有任意长度元素。
使用可伸缩的成员,规则如下:
1. 伸缩性数组成员必须是结构体的最后一个成员。2. 结构体中至少包含一个其他成员。3. 伸缩性数组的方括号为空。
struct student { int score; char name[]; };
当创建一个 `struct student` 类型的变量,你不能使用 `name` 成员,因为编译器并没有为其分配内存。C99 并不是想让您定义一个 `struct student` 类型的变量,而是希望声明一个指向 `struct student` 的指针,然后用 malloc 来分配空间,以存放 score 成员,以及伸缩性数组成员所需要的空间。
struct Person { int age; char name[]; }; int main(int argc, char *argv[]) { char *name1 = "Obama"; char *name2 = "Edward Meng"; struct Person *p1 = (struct Person *)malloc(sizeof(struct Person) + strlen(name1) + 1); p1->age = 33; strcpy(p1->name, name1); p1->name[strlen(name1)] = '\0'; struct Person *p2 = (struct Person *)malloc(sizeof(struct Person) + strlen(name2) + 1); p2->age = 33; strcpy(p2->name, name2); p2->name[strlen(name2)] = '\0'; printf("name:%s age:%d\n", p1->name, p1->age); printf("name:%s age:%d\n", p2->name, p2->age); getchar(); }