C語言冷門知識之你可能沒聽過的柔性數(shù)組
一、簡述
在c99中有明確的規(guī)定允許結(jié)構(gòu)體中最后一個數(shù)組大小是未知的。
柔性數(shù)組其實是結(jié)構(gòu)體中的最后一個數(shù)組未說明大小,且結(jié)構(gòu)體中至少包含一個以上其他類型,如
#include<stdio.h> struct hei { int zeng; char shi; int arr[];//或者int arr[0]; }ma; int main() { struct hei ma; return 0 }
二、具體使用
1.用創(chuàng)建柔性數(shù)組的方法:
#include<stdio.h> #include<stdlib.h> #include<stdlib.h>//或者是#include<malloc.h>動態(tài)內(nèi)存函數(shù)的頭文件 struct d { int nb; int nn; int arr[]; }; int main() { struct d *p=(struct d*)malloc(sizeof(struct d)+5*sizeof(int));//分別給結(jié)構(gòu)體中的除了柔 //性數(shù)組的其他類型和給柔性數(shù)組申請空間 p->nb=100; p->nn=50; for(int i=0;i<5;i++) { p->arr[i]=i;//賦值 printf("%d ",p->arr[i]); } struct d *pp=(struct d*)realloc(p,48); //重新調(diào)整所申請的空間,將柔性數(shù)組調(diào)整為40。 if(pp!=NULL) { p=pp; for(i=5;i<10;i++) { p->arr[i]=i;//賦值 printf("%d ",p->arr[i]); } free(p); p=NULL; } return 0; }
2.用普通的寫法
#include<stdio.h> #include<stdlib.h> struct bb { int a; int *arr; }; int main() { struct bb* p=(struct bb*)malloc(sizeof(struct bb)); p->a=20; p->arr=(int*)malloc(5*sizeof(int)); for(int i=0;i<5;i++) { p->arr[i]=i; printf("%d ",p->arr[i]); } int *ptr=(int*)realloc(p->arr,40); if(pp!=NULL) { p->arr=ptr; for(int i=5;i<10;i++) { int t=p->arr[i]=i; printf("%d ",t); } } free(p->arr); p->arr=NULL; free(p); p=NULL; return 0; }
三、柔性數(shù)組的特點
1.對比這兩種來看,柔性數(shù)組的特點在于只需要用一次malloc創(chuàng)建就可以,而普通的解法則需要兩
次,因為malloc申請的內(nèi)存位置是任意的,所以柔性數(shù)組可以減少內(nèi)存碎片化。
2.柔性數(shù)組申請的內(nèi)存更加集中,有利于查找使用。
3.sizeof求結(jié)構(gòu)體大小時所求出的大小沒有包括柔性數(shù)組的大小。
4.用malloc函數(shù)進行動態(tài)內(nèi)存申請時,柔性數(shù)組的大小應該大于結(jié)構(gòu)體的大小
以便于柔性數(shù)組適應預期大小。
5.柔性數(shù)組只用一次開辟,有利于提高訪問速度
------------------------------------------------------------------------------------------------------------------
小伙伴們有什么想法可以留言
到此這篇關于C語言冷門知識之你可能沒聽過的柔性數(shù)組的文章就介紹到這了,更多相關C語言 柔性數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++ 實現(xiàn)求最大公約數(shù)和最小公倍數(shù)
這篇文章主要介紹了c++ 實現(xiàn)求最大公約數(shù)和最小公倍數(shù)的相關資料,需要的朋友可以參考下2017-05-05數(shù)據(jù)結(jié)構(gòu) 紅黑樹的詳解
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 紅黑樹的詳解的相關資料,數(shù)據(jù)結(jié)構(gòu)中的二叉樹查找,紅黑樹的講解,需要的朋友可以參考下2017-07-07C++基礎入門教程(二):數(shù)據(jù)、變量、宏等
這篇文章主要介紹了C++基礎入門教程(二):數(shù)據(jù)、變量、宏等,本文講解了變量初始化、宏定義、三種進制數(shù)的表示、const初探、auto聲明等內(nèi)容,需要的朋友可以參考下2014-11-11