zoukankan      html  css  js  c++  java
  • 第 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;  //访问数组成员的一个元素

     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("
    Average: %g
    ", p->average);
    60 }
    flexmemb.c

    带伸缩型数组成员的结构有一些特殊的处理要求。

    1.不能用结构进行赋值和拷贝:

    struct flex *pf1, *pf2;

    ...

    *pf2 = *pf1;  //不要这样做

    2.不要以按值方式把这种结构传递给结构。原因是,按值传递一个参数与赋值类似。要把结构的地址传递给函数。

    3.不要使用带伸缩型数组成员的结构作为数组成员或另一个结构的成员。

  • 相关阅读:
    golang并发
    golang接口
    golang方法
    golang函数
    微信小程序请求封装
    使用vue实现打印功能时出现多余空白页的问题
    mybatis 基本配置
    sql调优
    触发器 索引
    收藏 故事形式讲解javaScript中创建对象和Java创建对象的区别
  • 原文地址:https://www.cnblogs.com/web1013/p/9181604.html
Copyright © 2011-2022 走看看