C語言中的柔性數(shù)組你真的了解嗎
柔性數(shù)組概念:
柔性數(shù)組就是一種特殊的數(shù)組
它也是結(jié)構(gòu)體最后一個成員
也就是說,它存在結(jié)構(gòu)體最后一個成員的位置上
特點:
1.柔性數(shù)組在結(jié)構(gòu)體的大小是未知的,在sizeof中不計算其大小
#include<stdio.h> struct S { int n ; int arr[0];//或者int arr[]; }; main() { printf("The size of the structure is %d",sizeof(struct S)); return 0; }
2.在結(jié)構(gòu)體中,如果存在柔性數(shù)組,就必須滿足它的前面含有其它的成員,來申請空間,,因為他的大小本身是未知的,不計算大小。
3.包含柔性數(shù)組的結(jié)構(gòu)體要靠malloc去動態(tài)申請這塊空間,這就體現(xiàn)了柔性數(shù)組的柔,也就是可以控制大小,且分配的空間一定滿足大于其它成員的大小。
與指針動態(tài)開辟的比較
在日常的編程中,有時候需要在結(jié)構(gòu)體中存放一個長度動態(tài)的數(shù)組
一般的做法,是在結(jié)構(gòu)體中定義一個指針成員,這個指針成員指向該數(shù)組所在的動態(tài)內(nèi)存空間
指針動態(tài)開辟
#include<stdio.h> struct S { int n; int* arr; }; int main() { struct S* ps = (struct S*)malloc(sizeof(struct S)); ps->n = 100; ps->arr = (int*)malloc(40); free(ps->arr); ps->arr = NULL; free(ps); ps = NULL; return 0; }
通過柔性數(shù)組來實現(xiàn)如下:
柔性數(shù)組
#include<stdio.h> struct S { int n; int arr[0];//柔性數(shù)組 }; int main() { struct S* ps = (struct S*)malloc(sizeof(struct S)+40); //使用 //改變申請的空間 struct S* tmp= (struct S*)realloc(ps, sizeof(struct S)+80); if (tmp == NULL) { return; } if (tmp != NULL) { ps = tmp; } return 0; }
指針動態(tài)開辟的缺點
1.此方式會多次進行開辟于釋放動態(tài)申請的空間,就容易會導(dǎo)致錯誤
2.容易出現(xiàn)內(nèi)存碎片
當指針動態(tài)開辟的足夠多的時候,中間就會出現(xiàn)很多內(nèi)存碎片,每個內(nèi)存碎片不連續(xù)
就會導(dǎo)致空間的浪費
3.相較于柔性數(shù)組,CPU訪問的速度要慢一些
CPU訪問內(nèi)存大部分在訪問一個空間后,就會訪問相鄰的空間,就不一次性訪問下一個連續(xù)的空間,這就會導(dǎo)致,在一定程度上的降速。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
使用C++17實現(xiàn)JSON庫設(shè)計思路示例全解
這篇文章主要為大家介紹了使用C++17實現(xiàn)JSON庫設(shè)計思路示例全解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08基于matlab實現(xiàn)DCT數(shù)字水印嵌入與提取
數(shù)字水印技術(shù)是將一些標識信息直接嵌入數(shù)字載體當中,?或間接表示在信號載體中,?且不影響原載體的使用價值。本文主要為大家介紹了基于matlab如何實現(xiàn)數(shù)字水印的嵌入與提取,感興趣的可以學習一下2022-01-01