第 14 章 结构和其他数据形式(伸缩型数组成员C9…
2018-06-18 03:45:49来源:未知 阅读 ()
伸缩型数组成员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.不要使用带伸缩型数组成员的结构作为数组成员或另一个结构的成员。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 关于各种不同开发语言之间数据加密方法(DES,RSA等)的互通的 2020-06-07
- C++ 共用体 2020-06-05
- C语言程序结构 2020-05-31
- 数据结构—链表 2020-05-29
- Qt做Tcp数据传输 2020-05-26
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash