柔性数组

 http://www.cnblogs.com/nchxmoon/p/3145480.html

       把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组。

     code:
    struct mumble {
      //stuff
      char pc[1];    };    

    //从档案或标准输入装置中取得一个字符串,然后为struct本身和该字符串配置足够的内存
    struct mumble *pmumbl=(struct mumble*)malloc(sizeof(struct(mumble)))+strlen(string)+1;
    strcpy(pmumbl->pc,string);

对于这段话,我刚开始的时候也是百思不得其解,经过一番研究之后,才知道这就是所谓的柔性数组用法。首先解释下柔性数组的概念:

  柔性数组(Flexible Array)也叫伸缩性数组,其实就是变长数组,反映了C语言对精炼代码的极致追求。这种代码结构产生于对动态结构体的需求。比如我们需要在结构体中存放一个动态长度的字符串,这时候,柔性数组可以大显身手了。

  C99使用不完整类型来实现柔性数组,标准形式如下:

    struct MyStruct

    {

      int a;

      double b;

      char c[]; // or char c[0]; 也可以用其他数据类型;

    };

  c不占用MyStruct的空间,只是作为一个符号地址存在,而且必须是结构体的最后一个成员。

  示例代码:

复制代码
#include <iostream>
#include <malloc.h>

using namespace std;

typedef struct MyStruct
{
    int a;
    double b;
    char c[];
} ms,*pms;

int main()
{
    char c1[] = "Short string.";
    char c2[] = "This is a long string.";

    pms pms1 = (pms)malloc( sizeof(ms) + strlen(c1) + 1 );//为pms1动态申请空间,当然要包括柔性数组实例化所占据的空间

    if( NULL != pms1 )
    {
        pms1->a = 1;
        pms1->b = 11;
        strcpy(pms1->c, c1);
    }

    cout<<"pms1: "<< pms1->a
        <<" "<<pms1->b
        <<" "<<pms1->c<< endl;

    pms pms2 = (pms)malloc( sizeof(ms)  +strlen(c2) + 1 );
    if( NULL != pms2 )
    {
        pms2->a = 2;
        pms2->b = 22;
        strcpy(pms2->c, c2);
    }

    cout<<"pms2: "<<pms2->a
        <<" "<<pms2->b
        <<" "<<pms2->c<< endl;

    free( pms1 );
    free( pms2 );//用完记得要回收空间

    return 0;
}
复制代码

  输出:

    pms1: 1 11 Short string.
    pms2: 2 22 This is a long string.

  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值