第 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; //访问数组成员的一个元素
/*-----------------------------------------------
flexmemb.c -- 伸缩性数组成员(C99新增特性)
-----------------------------------------------*/ #include <stdio.h>
#include <stdlib.h> //提供 malloc()、free() 原型 struct flex
{
size_t count;
double average;
double scores[]; //伸缩性数组成员
}; void showFlex(const struct flex *p); int main()
{
struct flex *pf1, *pf2;
int n = , tot = ; //为结构和数组分配存储空间
pf1 = (struct flex*)malloc(sizeof(struct flex) + n * sizeof(double));
pf1->count = n;
for (int i = ; i != n; ++i)
{
pf1->scores[i] = 20.0 - i;
tot += pf1->scores[i];
}
pf1->average = tot / n;
showFlex(pf1); n = ;
tot = ;
pf2 = (struct flex*)malloc(sizeof(struct flex) + n * sizeof(double));
pf2->count = n;
for (int i = ; i != n; ++i)
{
pf2->scores[i] = 20.0 - i / 2.0;
tot += pf2->scores[i];
}
pf2->average = tot / n;
showFlex(pf2); //释放分配内存
free(pf1);
free(pf2); return ;
} void showFlex(const struct flex *p)
{
printf("Scores: "); for (int i = ; i != p->count; ++i)
printf("%g ", p->scores[i]); printf("\nAverage: %g\n", p->average);
}
flexmemb.c
带伸缩型数组成员的结构有一些特殊的处理要求。
1.不能用结构进行赋值和拷贝:
struct flex *pf1, *pf2;
...
*pf2 = *pf1; //不要这样做
2.不要以按值方式把这种结构传递给结构。原因是,按值传递一个参数与赋值类似。要把结构的地址传递给函数。
3.不要使用带伸缩型数组成员的结构作为数组成员或另一个结构的成员。
第 14 章 结构和其他数据形式(伸缩型数组成员C99)的更多相关文章
- 第 14 章 结构和其他数据形式(names)
*--------------------------------- names1.c -- 使用指向结构的指针 ---------------------------------*/ #includ ...
- 第 14 章 结构和其他数据形式(enum枚举)
/*----------------------------- enum.c -- 使用枚举类型的值 -----------------------------*/ #include <stdi ...
- 第 14 章 结构和其他数据形式(names3)
/*----------------------------------- names3.c -- 使用指针和 malloc() ----------------------------------- ...
- C Primer Plus之结构和其他数据形式
声明和初始化结构指针 声明结构化指针,例如: struct guy * him; 初始化结构指针(如果barney是一个guy类型的结构),例如: him = &barney; 注意:和数组不 ...
- 【机器学习实战】第14章 利用SVD简化数据
第14章 利用SVD简化数据 SVD 概述 奇异值分解(SVD, Singular Value Decomposition): 提取信息的一种方法,可以把 SVD 看成是从噪声数据中抽取相关特征.从生 ...
- MySQL性能调优与架构设计——第 14 章 可扩展性设计之数据切分
第 14 章 可扩展性设计之数据切分 前言 通过 MySQL Replication 功能所实现的扩展总是会受到数据库大小的限制,一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时候,我 ...
- 《how to design programs》14章 再论自引用数据
这是一个家族谱: ;child(define-struct child (father mother name date eyes)) #lang racket ;child (define-stru ...
- C Primer Plus学习笔记(十三)- 结构和其他数据形式
建立结构声明 结构声明(structure declaration)描述了一个结构的组织布局 struct book { char title[MAXTITL]; char author[MAXAUT ...
- 《机器学习实战》学习笔记——第14章 利用SVD简化数据
一. SVD 1. 基本概念: (1)定义:提取信息的方法:奇异值分解Singular Value Decomposition(SVD) (2)优点:简化数据, 去除噪声,提高算法的结果 (3)缺点: ...
随机推荐
- Spark2.1.0——剖析spark-shell
在<Spark2.1.0——运行环境准备>一文介绍了如何准备基本的Spark运行环境,并在<Spark2.1.0——Spark初体验>一文通过在spark-shell中执行wo ...
- 祸害阿里云宕机 3 小时的 IO HANG 究竟是个什么鬼?!
2019年3月3日凌晨,微博炸锅,有网友反映说阿里云疑似出现宕机,华北很多互联网公司受到暴击伤害,APP.网站全部瘫痪,我自己的朋友圈和微信群里也有好友反馈,刚刚从被窝被叫起来去修Bug,结果发现服务 ...
- js 中格式化时间
在js中常常要求对时间的输出格式进行格式化,比如 2017-01-01 10:10,比较麻烦的是月,日,小时,分.它们的格式一般要求两位,如果小于10的话需要在前边补0,当然这算不上什么问题,可以通过 ...
- 选择ORACLE数据库字符集
如何选择数据库的字符集是一个有争议的话题,字符集本身涉及的范围很广,它与应用程序.客户的本地环境.操作系统.服务器等关系很密切,因此要做出合适的 选择,需要明白这些因素之间的关系.另外对字符集的基本概 ...
- [android] 切换按钮-自定义控件
准备两张图片,按钮背景,上面的小开关 创建一个类MyToggleBtn,继承View 实现三个构造方法,传递上下文, 实现构造方法,传递Context对象,在java代码中实例化时主要使用这个 实现构 ...
- 火星A+B(hdu1230)进制转化
火星A+B Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...
- Humble Numbers(hdu1058)
Humble Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- DataTable的数据或表结构复制
把datatable的结构全部数据或部分数据复制到一个新的datatabledatatable复制表结构:我们可以使用.clone()方法: DataTable oldDT = GetDataTabl ...
- HTML DOM 知识点整理(一)—— Document对象
一.DOM对象 DOM对象整体包括: HTML DOM Document对象 HTML DOM 元素对象 HTML DOM 属性对象 HTML DOM 事件对象 HTML DOM Console 对象 ...
- 使用LINQ查询数据实例和理解
使用LINQ查询数据实例和理解 var contacts= from customer in db.Customers where customer.Name.StartsWith("A&q ...