一文掌握C語(yǔ)言中的柔性數(shù)組
何為柔性數(shù)組(Flexible Array)
柔性數(shù)組在C語(yǔ)言的 C99 標(biāo)準(zhǔn)中,引入的新特性。結(jié)構(gòu)中的最后一個(gè)元素的大小允許是未知的數(shù)組,即為柔性數(shù)組。
struct S {
int i;
int arr[]; //柔性數(shù)組成員
/*int arr[0];*/ //這兩種寫法都可以,具體看編譯器
};1.柔性數(shù)組的特點(diǎn)
- 柔性數(shù)組不能單獨(dú)的出現(xiàn)在結(jié)構(gòu)體之中,至少要包含一個(gè)及以上其它成員,且要在末尾
- 利用sizeof計(jì)算的結(jié)構(gòu)體大小,并不會(huì)去計(jì)算柔性數(shù)組的大小
- 包含柔性數(shù)組成員的結(jié)構(gòu)體要利用malloc來(lái)進(jìn)行動(dòng)態(tài)內(nèi)存分配,且分配的內(nèi)存大小要大于結(jié)構(gòu)體內(nèi)存大小,來(lái)達(dá)到預(yù)期的所需內(nèi)存的大小。
2.柔性數(shù)組的創(chuàng)建和簡(jiǎn)單使用
創(chuàng)建
struct S {
int i;
int arr[];
};
int main() {
struct S *s = (struct S*)malloc(sizeof(struct S)+5*sizeof(int));
//使用malloc創(chuàng)建了一個(gè)大小為: (結(jié)構(gòu)體本身大?。?+ 柔性數(shù)組你所期望的大小
struct S *s = (struct S*)malloc(sizeof(struct S)+10*sizeof(int));
//調(diào)整柔性數(shù)組大小
return 0;
}

這就是為什么柔性數(shù)組為什么要在成員末尾的原因,只有它在末尾,開辟內(nèi)存的大小變化時(shí),柔性數(shù)組的大小才會(huì)隨著變化,這就是所謂的柔性數(shù)組
簡(jiǎn)單使用
代碼一
struct S {
int i;
int arr[];
};
int main() {
struct S *p = (struct S*)malloc(sizeof(struct S)+5*sizeof(int));
if(p == NULL)
return 1;
//業(yè)務(wù)處理
p->i = 100;
for (int i = 0; i < 100; i++)
{
p->arr[i] = i;
}
//釋放空間
free(p);
p = NULL;
return 0;
}3.柔性數(shù)組的優(yōu)勢(shì)
在上柔性數(shù)組的簡(jiǎn)單使用中,我們的代碼換種寫法也可以達(dá)到跟柔性數(shù)組一樣的功能
把柔性數(shù)組成員換成:指針變量
代碼二
struct S {
int i;
int *parr;
};
int main() {
struct S* p = (struct S*)malloc(sizeof(struct S));
if (p == NULL)
return 0;
p->parr = (int*)malloc(5 * sizeof(int));//多一次malloc就必然要多一次檢查和內(nèi)存釋放
if (p->parr == NULL)
return 0;
//業(yè)務(wù)處理
p->i = 100;
for (int i = 0; i < 100; i++)
{
p->parr = i;
}
//釋放空間
free(p->parr); //得先釋放結(jié)構(gòu)體成員parr所指向的空間
p->parr = NULL;
free(p); //在釋放p,若順序弄錯(cuò)造成內(nèi)存泄露
p->parr = NULL;
return 0;
}說(shuō)白了就是利用結(jié)構(gòu)體里的指針paar再去開辟一塊動(dòng)態(tài)內(nèi)存空間

代碼一比代碼二優(yōu)勢(shì)的地方在于:
優(yōu)勢(shì) 1 :方便內(nèi)存釋放
使用了較少次的malloc,這樣使后面的內(nèi)存釋放得到了方便,且也不容易造成內(nèi)存泄漏
優(yōu)勢(shì) 2 :提升性能

連續(xù)的內(nèi)存有益于提?訪問(wèn)速度,也有益于減少內(nèi)存碎?。
到此這篇關(guān)于c語(yǔ)言中的柔性數(shù)組的文章就介紹到這了,更多相關(guān)c語(yǔ)言柔性數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中std::thread{}和std::thread()用法
std::thread{}和std::thread()在C++中都可以用于創(chuàng)建線程對(duì)象,但std::thread{}作為C++11引入的統(tǒng)一初始化,更推薦使用,因?yàn)樗踩?、更易讀,且避免了隱式類型轉(zhuǎn)換2024-11-11
一文詳解matlab實(shí)現(xiàn)形態(tài)學(xué)圖像處理
這篇文章主要為大家介紹了matlab實(shí)現(xiàn)形態(tài)學(xué)圖像處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
C++程序的執(zhí)行順序結(jié)構(gòu)以及關(guān)系和邏輯運(yùn)算符講解
這篇文章主要介紹了C++程序的執(zhí)行順序結(jié)構(gòu)以及關(guān)系和邏輯運(yùn)算符講解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
C++ 將文件數(shù)據(jù)一次性加載進(jìn)內(nèi)存實(shí)例代碼
這篇文章主要介紹了C++ 將文件數(shù)據(jù)一次性加載進(jìn)內(nèi)存實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
Cocos2d-x UI開發(fā)之CCControlSwitch控件類使用實(shí)例
這篇文章主要介紹了Cocos2d-x UI開發(fā)之CCControlSwitch控件類使用實(shí)例,本文代碼中含大量注釋講解了CCControlSwitch控件類的使用,需要的朋友可以參考下2014-09-09
C語(yǔ)言的動(dòng)態(tài)內(nèi)存管理你了解嗎
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的動(dòng)態(tài)內(nèi)存管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03

