• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            C++分析研究  
            C++
            日歷
            <2013年6月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456
            統(tǒng)計
            • 隨筆 - 92
            • 文章 - 4
            • 評論 - 4
            • 引用 - 0

            導(dǎo)航

            常用鏈接

            留言簿

            隨筆檔案

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

             
              在日常的編程中,有時候需要在結(jié)構(gòu)體中存放一個長度動態(tài)的字符串,一般的做法,是在結(jié)構(gòu)體中定義一個指針成員,這個指針成員指向該字符串所在的動態(tài)內(nèi)存空間,例如:
             
               typedef struct test
             
               {
             
               int a;
             
               double b;
             
               char *p;
             
               };
             
               p指向字符串。這種方法造成字符串與結(jié)構(gòu)體是分離的,不利于操作。如果把字符串跟結(jié)構(gòu)體直接連在一起,不是更好嗎?于是,可以把代碼修改為這樣:
             
               char a[] = "hello world";
             
               test *stpTest = (test *)malloc(sizeof(test) + strlen( a ) + 1 );
             
               strcpy(stpTest + 1, a );
             
               這樣一來,(char*)(stpTest + 1)就是字符串"hello world"的地址了。這時候p成了多余的東西,可以去掉。但是,又產(chǎn)生了另外一個問題:老是使用(char*)((stpTest + 1)不方便。如果能夠找出一種方法,既能直接引用該字符串,又不占用結(jié)構(gòu)體的空間,就完美了,符合這種條件的代碼結(jié)構(gòu)應(yīng)該是一個非對象的符號地址,在結(jié)構(gòu)體的尾部放置一個0長度的數(shù)組是一個絕妙的解決方案。不過,C/C++標(biāo)準(zhǔn)規(guī)定不能定義長度為0的數(shù)組,因此,有些編譯器就把0長度的數(shù)組成員作為自己的非標(biāo)準(zhǔn)擴展。
             
               在講述柔性數(shù)組成員之前,首先要介紹一下不完整類型(incomplete type)。不完整類型是這樣一種類型,它缺乏足夠的信息例如長度去描述一個完整的對象,它的出現(xiàn)反映了C程序員對精煉代碼的極致追求,這種代碼結(jié)構(gòu)產(chǎn)生于對動態(tài)結(jié)構(gòu)體的需求。
             
               鑒于這種代碼結(jié)構(gòu)所產(chǎn)生的重要作用,C99甚至把它收入了標(biāo)準(zhǔn)中。C99使用不完整類型實現(xiàn)柔性數(shù)組成員,在C99 中,結(jié)構(gòu)中的最后一個元素允許是未知大小的數(shù)組,這就叫做柔性數(shù)組(flexible array)成員(也叫伸縮性數(shù)組成員),但結(jié)構(gòu)中的柔性數(shù)組成員前面必須至少一個其他成員。柔性數(shù)組成員允許結(jié)構(gòu)中包含一個大小可變的數(shù)組。柔性數(shù)組成員只作為一個符號地址存在,而且必須是結(jié)構(gòu)體的最后一個成員,sizeof 返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。柔性數(shù)組成員不僅可以用于字符數(shù)組,還可以是元素為其它類型的數(shù)組。包含柔性數(shù)組成員的結(jié)構(gòu)用malloc()函數(shù)進行內(nèi)存的動態(tài)分配,并且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng)柔性數(shù)組的預(yù)期大小。柔性數(shù)組的使用請看下面的例子:
             
               typedef struct test
             
               {
             
               int a;
             
               double b;
             
               char c[0];
             
               };
             
               有些編譯器會報錯無法編譯可以改成:
             
               typedef struct test
             
               {
             
               int a;
             
               double b;
             
               char c[];
             
               };
             
               通過如下表達式給結(jié)構(gòu)體分配內(nèi)存:
             
               test *stpRest = (test *)malloc(sizeof(test)+100*sizeof(char));
             
               c就是一個柔性數(shù)組成員,如果把stpTest指向的動態(tài)分配內(nèi)存看作一個整體,c就是一個長度可以動態(tài)變化的結(jié)構(gòu)體成員,柔性一詞來源于此。c的長度為0,因此它不占用test的空間,同時stpTest->c就是“hello world”的首地址,不需要再使用(char *)(stpTest + 1)這么丑陋的代碼了。那個0個元素的數(shù)組沒有占用空間,而后我們可以進行變長操作了。這樣我們?yōu)榻Y(jié)構(gòu)體指針c分配了一塊內(nèi)存。用stpTest->c[n]就能簡單地訪問可變長元素。
             
               當(dāng)然,上面既然用malloc 函數(shù)分配了內(nèi)存,肯定就需要用free 函數(shù)來釋放內(nèi)存:
             
               free(stpTest);
             
               應(yīng)當(dāng)盡量使用標(biāo)準(zhǔn)形式,在非C99的場合,可以使用指針方法。需要說明的是:C89不支持這種東西,C99把它作為一種特例加入了標(biāo)準(zhǔn)。但是,C99所支持的是incomplete type,而不是zero array,形同int a[0];這種形式是非法的,C99 支持的形式是形同int a[];只不過有些編譯器把int a[0];作為非標(biāo)準(zhǔn)擴展來支持,而且在C99 發(fā)布之前已經(jīng)有了這種非標(biāo)準(zhǔn)擴展了,C99 發(fā)布之后,有些編譯器把兩者合而為一了. www.qcwy123.com   托福答案
             
             
            posted on 2014-02-08 15:48 HAOSOLA 閱讀(565) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


             
            Copyright © HAOSOLA Powered by: 博客園 模板提供:滬江博客
            PK10開獎 PK10開獎
            伊色综合久久之综合久久| 亚洲精品乱码久久久久久自慰| 亚洲午夜精品久久久久久人妖| 国产精品午夜久久| 狠狠综合久久AV一区二区三区| 国产V亚洲V天堂无码久久久| 欧美日韩精品久久久免费观看| 日韩人妻无码一区二区三区久久| 国产精品无码久久四虎| 日韩av无码久久精品免费| 久久久久亚洲AV成人网人人软件| 婷婷伊人久久大香线蕉AV | 国产一级持黄大片99久久| 久久精品国产精品亜洲毛片| 国产综合久久久久| 久久久久亚洲AV片无码下载蜜桃 | 99国内精品久久久久久久| 国产成人精品久久亚洲高清不卡 | 久久国产亚洲精品| 久久精品国产清自在天天线| 国产亚洲色婷婷久久99精品| 久久久亚洲裙底偷窥综合| 久久九九久精品国产| 久久国产免费观看精品| .精品久久久麻豆国产精品 | 99久久99久久精品国产| 精品久久久久久无码中文字幕一区| 日韩精品久久久久久久电影| 性高朝久久久久久久久久| 国产精品狼人久久久久影院| 青青草国产精品久久久久| 国产精品久久影院| 97久久精品无码一区二区| 人妻精品久久久久中文字幕一冢本| 一本色道久久综合狠狠躁篇| 日本五月天婷久久网站| 欧美国产成人久久精品| 久久精品国产99国产精品亚洲 | 一本色综合久久| 亚洲午夜福利精品久久| 亚洲欧美精品一区久久中文字幕|