第 14 章 结构和其他数据形式(伸缩型数组成员C99)
伸缩型数组成员C99
声明一个伸缩型数组成员的规则:
1.伸缩型数组成员必须是结构的最后一个成员;
2.结构中必须至少有一个成员;
3.伸缩数组的方括号是空的。
示例
struct flex
{
int count;
double average;
double scores[]; //伸缩型数组成员
};
C99的意图并不是声明 struct flex 类型的变量,而是希望你声明一个指向 struct flex 类型的指针,然后用 malloc() 来分配足够的空间,以储存 struct flex 类型结构的常规内容和伸缩型数组成员所需的额外空间。例如,假设用 scores 表示一个内含5个 double 类型值的数组:
struct flex *pf; //声明一个指针
pf = (struct flex*)malloc(sizeof(struct flex) + 5 * sizeof(double)); //为结构和数组分配存储空间
现在有足够的存储空间储存 count、average 和一个含有5个 double 类型值的数组。可以用指针 pf 访问这些成员:
pf->count = 5; //设置 count 成员
pt->scores[2] = 18.5; //访问数组成员的一个元素
1 /*----------------------------------------------- 2 flexmemb.c -- 伸缩性数组成员(C99新增特性) 3 -----------------------------------------------*/ 4 5 #include <stdio.h> 6 #include <stdlib.h> //提供 malloc()、free() 原型 7 8 struct flex 9 { 10 size_t count; 11 double average; 12 double scores[]; //伸缩性数组成员 13 }; 14 15 void showFlex(const struct flex *p); 16 17 int main() 18 { 19 struct flex *pf1, *pf2; 20 int n = 5, tot = 0; 21 22 //为结构和数组分配存储空间 23 pf1 = (struct flex*)malloc(sizeof(struct flex) + n * sizeof(double)); 24 pf1->count = n; 25 for (int i = 0; i != n; ++i) 26 { 27 pf1->scores[i] = 20.0 - i; 28 tot += pf1->scores[i]; 29 } 30 pf1->average = tot / n; 31 showFlex(pf1); 32 33 n = 9; 34 tot = 0; 35 pf2 = (struct flex*)malloc(sizeof(struct flex) + n * sizeof(double)); 36 pf2->count = n; 37 for (int i = 0; i != n; ++i) 38 { 39 pf2->scores[i] = 20.0 - i / 2.0; 40 tot += pf2->scores[i]; 41 } 42 pf2->average = tot / n; 43 showFlex(pf2); 44 45 //释放分配内存 46 free(pf1); 47 free(pf2); 48 49 return 0; 50 } 51 52 void showFlex(const struct flex *p) 53 { 54 printf("Scores: "); 55 56 for (int i = 0; i != p->count; ++i) 57 printf("%g ", p->scores[i]); 58 59 printf("\nAverage: %g\n", p->average); 60 }
带伸缩型数组成员的结构有一些特殊的处理要求。
1.不能用结构进行赋值和拷贝:
struct flex *pf1, *pf2;
...
*pf2 = *pf1; //不要这样做
2.不要以按值方式把这种结构传递给结构。原因是,按值传递一个参数与赋值类似。要把结构的地址传递给函数。
3.不要使用带伸缩型数组成员的结构作为数组成员或另一个结构的成员。
下一篇: 机器人代替熟练工人 梦想与现实还相差甚远