C語言冷門知識之你可能沒聽過的柔性數組
一、簡述
在c99中有明確的規定允許結構體中最後一個數組大小是未知的。
柔性數組其實是結構體中的最後一個數組未說明大小,且結構體中至少包含一個以上其他類型,如
#include<stdio.h> struct hei { int zeng; char shi; int arr[];//或者int arr[0]; }ma; int main() { struct hei ma; return 0 }
二、具體使用
1.用創建柔性數組的方法:
#include<stdio.h> #include<stdlib.h> #include<stdlib.h>//或者是#include<malloc.h>動態內存函數的頭文件 struct d { int nb; int nn; int arr[]; }; int main() { struct d *p=(struct d*)malloc(sizeof(struct d)+5*sizeof(int));//分別給結構體中的除瞭柔 //性數組的其他類型和給柔性數組申請空間 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); //重新調整所申請的空間,將柔性數組調整為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; }
三、柔性數組的特點
1.對比這兩種來看,柔性數組的特點在於隻需要用一次malloc創建就可以,而普通的解法則需要兩
次,因為malloc申請的內存位置是任意的,所以柔性數組可以減少內存碎片化。
2.柔性數組申請的內存更加集中,有利於查找使用。
3.sizeof求結構體大小時所求出的大小沒有包括柔性數組的大小。
4.用malloc函數進行動態內存申請時,柔性數組的大小應該大於結構體的大小
以便於柔性數組適應預期大小。
5.柔性數組隻用一次開辟,有利於提高訪問速度
——————————————————————————————————————
小夥伴們有什麼想法可以留言
到此這篇關於C語言冷門知識之你可能沒聽過的柔性數組的文章就介紹到這瞭,更多相關C語言 柔性數組內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!