第 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)缺点: ...
随机推荐
- java web 手动部署项目步骤
java Web 手动部署项目步骤 1 在tomcat下面的webapps下面建立需要部署的文件夹(eg:demo);2 在demo下建立 WEB-INF WETA-INF src 文件夹;3 在sr ...
- java的classLoader分析与jettty的WebAppClassLoader
classLoader,从名字就可以知道,用于加载class的东西. 我们知道在Java中,源文件是会被编译成class文件的,我们的程序的运行也是需要依赖这些编译成字节码的class文件,而这些字节 ...
- 代码部署工具walle(一)
一.概述 代码部署上线.权限控制.一键版本回滚,github地址:https://github.com/meolu/walle-web walle是基于php语言做的,所以需要一个php的安装环境. ...
- (转)Spring常见注解总结
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文 ...
- tcp/ip通信中udp头部结构udphdrp->check校验计算
通过raw socket修改通信数据后,可通过函数 set_udp_checksum1 重新校验计算iph->check值 在http://www.cnblogs.com/dpf-10/p/78 ...
- Quart2D文字图像绘制
上一个是绘制简单图形,这一篇学习绘制文字.图像 //获取画布 CGContextRef context=UIGraphicsGetCurrentContext(); //设置边框颜色 CGContex ...
- params关键字、工具辅助类与、加密与解密
一.params关键字 在C#中如果给方法的参数加上关键字params则会形成可变参数,在传递时可以是0-n个对象. 示例: using System; using System.Collection ...
- winform窗体 小程序【移动窗体和阴影】
窗体无边框设置后无法移动,引用API 使其获得功能 移动 //窗体移动API [DllImport("user32.dll")] public static extern bool ...
- Hibernate映射 --- 自身跟自身的一对多关联
自身跟自身的一对多关联 什么时候会出现自身一对多关系呢?下面举个例子. 淘宝店里商品分类,一级分类:家用电器,个人化妆,运动户外等 家用电器下面二级分类:大家电,生活电器,厨房电器等 二级分类大家 ...
- 码云创建maven工程
码云创建maven工程步骤 1.现在码云上创建工程2.拉取到本地3.使用"touch .gitignore"命令创建.gitignore文件4.在文件中添加过滤文件: .setti ...