struct 的可伸缩数组成员

struct 的可伸缩数组成员

C99 提供了一个叫伸缩性数组成员的特性,利用它我们可以声明结构体的最后一个成员具有特殊的属性。这个数组成员有什么特点呢?我们来看两点。
第一,该成员可存在也可不存在,当它不存在时,并不占用结构体的大小。
第二,使用这个伸缩的成员,可以让它具有任意长度的元素。
那么使用伸缩数组成员,要遵守哪些规则呢?一共有三条。
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();
}