零長(zhǎng)度數(shù)組(Zero-length array)與柔性數(shù)組(Flexible array)
GNU C允許使用零長(zhǎng)度數(shù)組,它們非常有用。如下是一個(gè)零長(zhǎng)度數(shù)組的應(yīng)用,零長(zhǎng)數(shù)組在有固定頭部的可變對(duì)象上非常有用。
struct line{
int len;
char contents[0]
};
零長(zhǎng)數(shù)組使用的優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
- 不需要使用指針來(lái)分配內(nèi)存,節(jié)約一個(gè)指針變量所占內(nèi)存大小,也使內(nèi)存申請(qǐng)方式更加便捷;
- 分配的內(nèi)存連續(xù),管理與釋放簡(jiǎn)單,只需要一次操作。
缺點(diǎn)
- 零長(zhǎng)數(shù)組是GNU C的實(shí)現(xiàn),非標(biāo)準(zhǔn),因此并不是所有的編譯器都支持,有移植風(fēng)險(xiǎn)。
而在最新的ISO C99實(shí)現(xiàn)中,我們可以使用柔性數(shù)組,與零長(zhǎng)數(shù)組相比,在語(yǔ)法和語(yǔ)義上有些許差異:
- 柔性數(shù)組寫(xiě)成
contents[],沒(méi)有0。 - 柔性數(shù)組屬于不完整類(lèi)型,可能
sizeof操作符不能運(yùn)用在它上面。作為零長(zhǎng)數(shù)組原始實(shí)現(xiàn)的變體,sizeof計(jì)算結(jié)果為0。 - 柔性數(shù)組作為成員只能出現(xiàn)在
struct的最后。 - 一個(gè)包含柔性數(shù)組成員的結(jié)構(gòu)體或包含這樣結(jié)構(gòu)體的聯(lián)合體,不能成為一個(gè)結(jié)構(gòu)體的成員或數(shù)組的元素。
比較零長(zhǎng)數(shù)組和柔性數(shù)組,他們的功能性是一致的:方便的應(yīng)用在有固定頭部的可變對(duì)象上。這種特性非常適用于網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)膱?chǎng)合。需要注意的是,他們分別一個(gè)是非標(biāo)準(zhǔn)一個(gè)是標(biāo)準(zhǔn),零長(zhǎng)數(shù)組是由GNU提出并實(shí)現(xiàn)的,這也反應(yīng)了當(dāng)時(shí)C編程者對(duì)于這種特性的需求??梢韵胂?,ISO C99吸收了這個(gè)特性并加以改變而產(chǎn)生了柔性數(shù)組。