伸缩型数组成员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)的更多相关文章

  1. 第 14 章 结构和其他数据形式(names)

    *--------------------------------- names1.c -- 使用指向结构的指针 ---------------------------------*/ #includ ...

  2. 第 14 章 结构和其他数据形式(enum枚举)

    /*----------------------------- enum.c -- 使用枚举类型的值 -----------------------------*/ #include <stdi ...

  3. 第 14 章 结构和其他数据形式(names3)

    /*----------------------------------- names3.c -- 使用指针和 malloc() ----------------------------------- ...

  4. C Primer Plus之结构和其他数据形式

    声明和初始化结构指针 声明结构化指针,例如: struct guy * him; 初始化结构指针(如果barney是一个guy类型的结构),例如: him = &barney; 注意:和数组不 ...

  5. 【机器学习实战】第14章 利用SVD简化数据

    第14章 利用SVD简化数据 SVD 概述 奇异值分解(SVD, Singular Value Decomposition): 提取信息的一种方法,可以把 SVD 看成是从噪声数据中抽取相关特征.从生 ...

  6. MySQL性能调优与架构设计——第 14 章 可扩展性设计之数据切分

    第 14 章 可扩展性设计之数据切分 前言 通过 MySQL Replication 功能所实现的扩展总是会受到数据库大小的限制,一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时候,我 ...

  7. 《how to design programs》14章 再论自引用数据

    这是一个家族谱: ;child(define-struct child (father mother name date eyes)) #lang racket ;child (define-stru ...

  8. C Primer Plus学习笔记(十三)- 结构和其他数据形式

    建立结构声明 结构声明(structure declaration)描述了一个结构的组织布局 struct book { char title[MAXTITL]; char author[MAXAUT ...

  9. 《机器学习实战》学习笔记——第14章 利用SVD简化数据

    一. SVD 1. 基本概念: (1)定义:提取信息的方法:奇异值分解Singular Value Decomposition(SVD) (2)优点:简化数据, 去除噪声,提高算法的结果 (3)缺点: ...

随机推荐

  1. 【JS点滴】substring和substr以及slice和splice的用法和区别。

    那么就由一道笔试题引入吧,已知有字符串a=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”: var a = "get-el ...

  2. async/await 与 generator、co 的对比

    之前写过一个分批预加载资源的插件,其实质便是串行执行异步,使用的方法是generator + promise -- 前几天写了一个爬虫,抓取页面的n个页面的音频资源,其也是串行执行异步,但是在使用的a ...

  3. windows系统 PHP安装Redis扩展

    cmd开启/关闭redis redis所在路径: D:\redis\Redis-x64-3.2.100 启动: start cmd /k "cd /d D:\redis\Redis-x64- ...

  4. TabControl控件在左侧绘制tabPage页面

    效果图:

  5. Mysql技能之【性能优化方案】

    两个SHOW命令 Mysql服务状态 SHOW GLOBAL STATUS; Mysql配置信息 SHOW VARIABLES: 慢查询 show variables like '%slow%'; s ...

  6. sql 查询结果作为数据进行添加,where in 子查询

    查询结果作为数据进行添加 INSERT INTO a ( Aid, Atitle, Url, Pic1 ) SELECT c Aid,d Atitle,e Url,f Pic1 FROM b 对于大神 ...

  7. 安卓开发笔记①:利用高德地图API进行定位、开发电子围栏、天气预报、轨迹记录、搜索周边(位置)

    高德地图开发时需要导入的包在下面的网盘链接中:(由于高德地图api更新得太快,官网上最新的包使用起来没有之前的方便,所以以下提供最全面的原始包) 链接:http://pan.baidu.com/s/1 ...

  8. Linux下安装SQL Server 2016(准备篇SQL Server on linux)

    要在Linux安装sql server,首先的先有linux,下面会讲下载,然后安装Linux. 一.下载centos 7.2 : Centos 7.2下载 大概4G左右,这个链接的下载速度还是非常快 ...

  9. Java - HashCode源码解析

    Java提高篇(二六)-----hashCode hashCode的作用 要想了解一个方法的内在原理,我们首先需要明白它是干什么的,也就是这个方法的作用.在讲解数组时(java提高篇(十八)----- ...

  10. Linux常用基本命令( mkdir )

    mkdir: 作用:创建目录( make directories ) 命令格式: make [option] 目录 1,创建目录, 当目录存在时,再次创建会提示文件已经存在 ghostwu@dev:~ ...