• C99柔性数组成员介绍(其一)

    flexible array member
    服务器君一共花费 37.577 ms 进行了 4 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    从哈希桶的数据结构定义看柔性数组的概念

    对于PHP的HashTable,关键元素就是arBuckets了,这个是哈希表实际存储的容器。它的结构定义我们之前也重复了几次了,这里不厌其烦地再贴一次:

    typedef struct bucket {
    	ulong h;             		/* 数字索引/hash值 */
    	uint nKeyLength;       		/* 字符索引的长度 */
    	void *pData;           		/* 数据 */
    	void *pDataPtr;          	/* 数据指针 */
    	struct bucket *pListNext;  	/* 下一个元素, 用于线性遍历 */
    	struct bucket *pListLast; 	/* 上一个元素, 用于线性遍历 */
    	struct bucket *pNext;   	/* 处于同一个拉链中的下一个元素 */
    	struct bucket *pLast; 		/* 处于同一拉链中的上一个元素 */
    	char arKey[1]; 	/* 节省内存,方便初始化的技巧 */
    } Bucket;
    

    我们注意到最后一个元素 char arKey[1]; 这个是 flexible array 的用法,这个特性称为伸缩型数组成员。

    柔性数组(flexible array)

    也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其他成员。柔性数组成员允许结构中包含一个大小可变的数组。sizeof 返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

    柔性数组到底如何使用呢?看下面例子:

    typedef struct st_type
    {
    	int i;
    	int a[0];
    }type_a;
    

    有些编译器会报错无法编译可以改成:

    typedef struct st_type
    {
    	int i;
    	int a[];
    }type_a;
    

    这样我们就可以定义一个可变长的结构体, 用sizeof(type_a) 得到的只有4 , 就是sizeof(i)=sizeof(int)。那个0 个元素的数组没有占用空间,而后我们可以进行变长操作了。通过如下表达式给结构体分配内存:

    type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));
    

    柔性数组的声明规则

    这个特性的作用是可以声明最后一个成员是一个具有特殊属性的结构,该数组成员有两个特征:

    • 不独立存在;
    • 可以编写适当的代码使用这个伸缩型数组成员,就像他确实存在,并且拥有你需要的任何数量的元素一样。

    首先,看看声明一个伸缩型数组成员的规则:

    1. 伸缩型数组必须是结构的最后一个数组成员;
    2. 结构中必须有一个其他成员;
    3. 伸缩型数组成员就想普通数组一样被声明,除了他的方括号里是空的。

    下面是一个按照上面规则声明的结构,包含了伸缩型数组成员:

    struct flex
    {
        int cout;
        double average;
        double scores[]; // 伸缩型数组成员
    };
    

    如果只是声明了一个struct flex类型的变量,其中的scores是不能够使用的,因为不确定大小,编译器没法为其分配所需要的存储空间。C99允许这种声明是为了让我们声明一个指向struct flex类型的指针,然后使用malloc来分配内存空间,用于存放struct flex结构可以确定的内容的空间,和伸缩型数组成员所需要的额外空间。

    struct flex *pf;
    pf = malloc(sizeof(struct flex) + n * sizeof(double));
    

    以上代码先声明了一个指向struct flex结构的指针,在使用malloc分配了结构和伸缩型数组的空间。有了足够的内存空间,可以存储count,average,和一个n个double型数值的数组,接下来就可以使用pf访问结构里的成员了。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [移动开发] Android 网络通信框架Volley 1 个条目
  2. [智力开发与知识管理] 信息的类型与结构 9 个条目
  3. [移动开发] Android Studio的使用技巧 4 个条目
  4. [Python程序设计] 标准库:urllib/urllib2 14 个条目
  5. [PHP程序设计] PHP与函数式编程 1 个条目
  6. [Python程序设计] Django 入门知识浅介 10 个条目
  7. [搜索引擎优化] 与百度权重有关的信息 2 个条目
  8. [PHP程序设计] 命令式编程范式 6 个条目
  9. [计算机算法] 从双端队列引出的卡特兰数 3 个条目
  10. [数据库技术] MySQL中英文混合排序 4 个条目
  11. [数据库技术] SQL基础语法 1 个条目
  12. [移动开发] Android布局基本知识 3 个条目
窗口 -- [资讯]