您好,登錄后才能下訂單哦!
首先,我們來看一個(gè)題
typedef struct list_t{ struct list_t *next; struct list_t *prev; char data[0]; }list_t;
此時(shí),你知道32位系統(tǒng)中,sizeof(list_t)的值為多少么?
這時(shí),你會(huì)告訴我char data[0]在C和C++中是不被允許的,因?yàn)榭雌饋砗翢o意義。然而,此處為何可以呢?
在講述柔性數(shù)組成員之前,首先要介紹一下不完整類型(incomplete type)。不完整類型是這樣一種類型,它缺乏足夠的信息例如長(zhǎng)度去描述一個(gè)完整的對(duì)象,它的出現(xiàn)反映了C程序員對(duì)精煉代碼的極致追求,這種代碼結(jié)構(gòu)產(chǎn)生于對(duì)動(dòng)態(tài)結(jié)構(gòu)體的需求。
鑒于這種代碼結(jié)構(gòu)所產(chǎn)生的重要作用,C99甚至把它收入了標(biāo)準(zhǔn)中。C99使用不完整類型實(shí)現(xiàn)柔性數(shù)組成員,在C99 中,結(jié)構(gòu)中的最后一個(gè)元素允許是未知大小的數(shù)組,這就叫做柔性數(shù)組(flexible array)成員(也叫伸縮性數(shù)組成員),但結(jié)構(gòu)中的柔性數(shù)組成員前面必須至少一個(gè)其他成員。柔性數(shù)組成員允許結(jié)構(gòu)中包含一個(gè)大小可變的數(shù)組。柔性數(shù)組成員只作為一個(gè)符號(hào)地址存在,而且必須是結(jié)構(gòu)體的最后一個(gè)成員,sizeof 返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。柔性數(shù)組成員不僅可以用于字符數(shù)組,還可以是元素為其它類型的數(shù)組。包含柔性數(shù)組成員的結(jié)構(gòu)用malloc()函數(shù)進(jìn)行內(nèi)存的動(dòng)態(tài)分配,并且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng)柔性數(shù)組的預(yù)期大小。
并且柔性數(shù)組不占內(nèi)存和內(nèi)存對(duì)齊。而且使用柔性數(shù)組可以大大簡(jiǎn)化內(nèi)容的管理,只需要一次申請(qǐng),然后通過數(shù)組的指針偏移就可以直接獲得相應(yīng)的數(shù)據(jù)緩沖區(qū),非常簡(jiǎn)單,釋放的時(shí)候也僅僅只需要一次釋放。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。