一文掌握C語言中的柔性數組
何為柔性數組(Flexible Array)
柔性數組在C語言的 C99 標準中,引入的新特性。結構中的最后一個元素的大小允許是未知的數組,即為柔性數組。
struct S { int i; int arr[]; //柔性數組成員 /*int arr[0];*/ //這兩種寫法都可以,具體看編譯器 };
1.柔性數組的特點
- 柔性數組不能單獨的出現在結構體之中,至少要包含一個及以上其它成員,且要在末尾
- 利用sizeof計算的結構體大小,并不會去計算柔性數組的大小
- 包含柔性數組成員的結構體要利用malloc來進行動態(tài)內存分配,且分配的內存大小要大于結構體內存大小,來達到預期的所需內存的大小。
2.柔性數組的創(chuàng)建和簡單使用
創(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)建了一個大小為: (結構體本身大小) + 柔性數組你所期望的大小 struct S *s = (struct S*)malloc(sizeof(struct S)+10*sizeof(int)); //調整柔性數組大小 return 0; }
這就是為什么柔性數組為什么要在成員末尾的原因,只有它在末尾,開辟內存的大小變化時,柔性數組的大小才會隨著變化,這就是所謂的柔性數組
簡單使用
代碼一
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è)務處理 p->i = 100; for (int i = 0; i < 100; i++) { p->arr[i] = i; } //釋放空間 free(p); p = NULL; return 0; }
3.柔性數組的優(yōu)勢
在上柔性數組的簡單使用中,我們的代碼換種寫法也可以達到跟柔性數組一樣的功能
把柔性數組成員換成:指針變量
代碼二
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就必然要多一次檢查和內存釋放 if (p->parr == NULL) return 0; //業(yè)務處理 p->i = 100; for (int i = 0; i < 100; i++) { p->parr = i; } //釋放空間 free(p->parr); //得先釋放結構體成員parr所指向的空間 p->parr = NULL; free(p); //在釋放p,若順序弄錯造成內存泄露 p->parr = NULL; return 0; }
說白了就是利用結構體里的指針paar再去開辟一塊動態(tài)內存空間
代碼一比代碼二優(yōu)勢的地方在于:
優(yōu)勢 1 :方便內存釋放
使用了較少次的malloc,這樣使后面的內存釋放得到了方便,且也不容易造成內存泄漏
優(yōu)勢 2 :提升性能
連續(xù)的內存有益于提?訪問速度,也有益于減少內存碎?。
到此這篇關于c語言中的柔性數組的文章就介紹到這了,更多相關c語言柔性數組內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決Visual?Studio?Code錯誤Cannot?build?and?debug?because?
這篇文章主要為大家介紹了解決Visual?Studio?Code錯誤Cannot?build?and?debug?because?the及分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07C/C++動態(tài)分配與釋放內存的區(qū)別詳細解析
以下是對C與C++中動態(tài)分配與釋放內存的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下2013-09-09