C99中結(jié)構(gòu)中的最后一個(gè)元素是未知大小的數(shù)組稱(chēng)為靈活數(shù)據(jù)結(jié)構(gòu)成員,但是結(jié)構(gòu)中的靈活數(shù)組成員前面必須至少有一個(gè)其它成員.靈活數(shù)組成員也許結(jié)構(gòu)中包含一個(gè)可變大小的數(shù)組.這種結(jié)構(gòu)的sizeof返回大小不包含靈活數(shù)組的內(nèi)存.包含靈活數(shù)組成員的結(jié)構(gòu)使用malloc進(jìn)行內(nèi)存動(dòng)態(tài)分配,并且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng)靈活數(shù)組的預(yù)期大小. - 摘自《C語(yǔ)言大全》 一個(gè)使用靈活數(shù)組的示例如下: #include // 定義一個(gè)靈活數(shù)組 typedef struct StType { int count; int item[0]; } StType; int main() { printf(“sizeof(StType) = %d\n”, (int)sizeof(StType)); int val[4] = {3, 1, 2, 3}; StType *st = (StType*)val; for (int i = 0; i < st->count; i++) printf(“%d value =%d\n”, i, st->item[i]); return 0; } 編譯后運(yùn)行結(jié)果如下: sizeof(StType) = 4 0 value = 1 1 value = 2 2 value = 3 從上面的結(jié)果可以看出item[0]并沒(méi)有占用空間,這樣我們可以使用malloc或者new來(lái)進(jìn)行變長(zhǎng)操作,如下所示. StType*st=(StType*)newchar[sizeof(StType)+100*sizeof(int)]; st.count=100; delete[]st; 上面的代碼生產(chǎn)一個(gè)100個(gè)item的StType對(duì)象,可以使用delete[]st;釋放分配的內(nèi)存. 這種靈活數(shù)組成員(Fleiblearray member)在C89中是不支持的,C99作為一種特例加入到標(biāo)準(zhǔn)中,但是C99所支持的是不完整類(lèi)型,而不是0數(shù)組,使用int item[0];定義是非法的,需要使用int item[]替代它,有些編譯器可以使用是因?yàn)榫幾g器把int item[0]作為非標(biāo)準(zhǔn)來(lái)支持. 注:在VC中編譯會(huì)提示告警信息,如下: warning C4200: nonstandard extension used :zero-sized array in struct/union Cannot generate copy-ctor orcopy-assignment operator when UDT contains a zero-sized array 注意區(qū)分 C99新增的“可變長(zhǎng)數(shù)組”: C89 標(biāo)準(zhǔn)規(guī)定,數(shù)組大小必須是在編譯時(shí)刻確定的;在C99 中,這個(gè)標(biāo)準(zhǔn)項(xiàng)被擴(kuò)展,可以是運(yùn)行時(shí)刻確定的值.也就是說(shuō),可變長(zhǎng)數(shù)組和 C++ 本身沒(méi)有關(guān)系,只要是支持 C99 的就可以使用可變長(zhǎng)數(shù)組,包括支持 C99 的 C 編譯器. 需要注意的是,可變長(zhǎng)數(shù)組的維數(shù)在數(shù)組生存期內(nèi)是不變的,也就是說(shuō),可變長(zhǎng)數(shù)組不是動(dòng)態(tài)的,可變的只是數(shù)組的大小. 有時(shí)候人們會(huì)考慮暫時(shí)不存在的兼容性問(wèn)題,如果把程序移植到只有標(biāo)準(zhǔn)C89編譯器的平臺(tái),那下面有幾種可以替代的方法: