柔性數組-讀《深度探索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.

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM