zoukankan      html  css  js  c++  java
  • 柔性数组-读《深度探索C++对象模型》有感

    最近在看《深度探索C++对象模型》,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者。

    原文如下:

      例如,把单一元素的数组放在一个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 );
        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.

      

  • 相关阅读:
    存储器管理
    进程与线程
    进程间通信 IPC(Inter-Process Communication)
    进程的同步与互斥
    【bzoj4806~bzoj4808】炮车马后——象棋四连击
    【bzoj1013】[JSOI2008]球形空间产生器sphere
    【bzoj5427】最长上升子序列(贪心+LIS)
    NOIP2018没有什么新闻
    【bzoj3170】[Tjoi2013]松鼠聚会(数学题)
    【bzoj5170】Fable(树状数组)
  • 原文地址:https://www.cnblogs.com/nchxmoon/p/3145480.html
Copyright © 2011-2022 走看看