伸缩型数组成员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 = , tot = ;
  21.  
  22. //为结构和数组分配存储空间
  23. pf1 = (struct flex*)malloc(sizeof(struct flex) + n * sizeof(double));
  24. pf1->count = n;
  25. for (int i = ; 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 = ;
  34. tot = ;
  35. pf2 = (struct flex*)malloc(sizeof(struct flex) + n * sizeof(double));
  36. pf2->count = n;
  37. for (int i = ; 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 ;
  50. }
  51.  
  52. void showFlex(const struct flex *p)
  53. {
  54. printf("Scores: ");
  55.  
  56. for (int i = ; i != p->count; ++i)
  57. printf("%g ", p->scores[i]);
  58.  
  59. printf("\nAverage: %g\n", p->average);
  60. }

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. async/await 与 generator、co 的对比

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

  2. CompletableFuture 专题

    /** * @Auther: cheng.tang * @Date: 2019/3/2 * @Description: */ package com.tangcheng.learning.concur ...

  3. iOS开源项目周报0413

    由OpenDigg 出品的iOS开源项目周报第十六期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. glidin ...

  4. EPPlus批量插入图片到Excel

    #region 测试EPPlus插入图片        public static void Createsheel2()        {                      WebClien ...

  5. Jquery特殊属性

    val():获取或设置元素的值,主要用于input. 参数:string 字符串     设置元素的值: 不写参数:获取元素的值: 其实这个属性  我们也可以用attr操作,但是没有这个方便  添加类 ...

  6. 用MVC5+EF6+WebApi 做一个小功能(四) 项目分层功能以及文件夹命名

    在上一节,我们完成了一个项目搭建,我们看到的是一个项目的分层架子,那接下来每一层做什么以及需要引用哪些内容呢?在本节内容我们还逐步拆分每一层的功能,顺带添加package包 Trump.Domain ...

  7. [日常] Go语言圣经-竞争条件习题

    package main import( "fmt" "sync" ) var balance int func Deposit(amount int) { b ...

  8. 一.JDK版本切换批处理脚本

    我们平时在window上做开发的时候,可能需要同时开发两个甚至多个项目,有时不同的项目对JDK的版本要求有区别,这时候我们可能会在一台电脑上安装多个版本的JDK,如下图所示:

  9. Mock session,cookie,querystring in ASB.NET MVC

    写测试用例的时候经常发现,所写的功能需要Http上下文的支持(session,cookie)这类的. 以下介绍2种应用场景. 用于控制器内Requet获取参数 控制器内的Requet其实是控制器内的属 ...

  10. 子序列个数(fzu2129)

    子序列个数 Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...