C語言中的柔性數(shù)組你真的了解嗎
柔性數(shù)組概念:
柔性數(shù)組就是一種特殊的數(shù)組
它也是結構體最后一個成員
也就是說,它存在結構體最后一個成員的位置上
特點:
1.柔性數(shù)組在結構體的大小是未知的,在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.在結構體中,如果存在柔性數(shù)組,就必須滿足它的前面含有其它的成員,來申請空間,,因為他的大小本身是未知的,不計算大小。
3.包含柔性數(shù)組的結構體要靠malloc去動態(tài)申請這塊空間,這就體現(xiàn)了柔性數(shù)組的柔,也就是可以控制大小,且分配的空間一定滿足大于其它成員的大小。
與指針動態(tài)開辟的比較
在日常的編程中,有時候需要在結構體中存放一個長度動態(tài)的數(shù)組
一般的做法,是在結構體中定義一個指針成員,這個指針成員指向該數(shù)組所在的動態(tà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)申請的空間,就容易會導致錯誤
2.容易出現(xiàn)內存碎片
當指針動態(tài)開辟的足夠多的時候,中間就會出現(xiàn)很多內存碎片,每個內存碎片不連續(xù)
就會導致空間的浪費

3.相較于柔性數(shù)組,CPU訪問的速度要慢一些
CPU訪問內存大部分在訪問一個空間后,就會訪問相鄰的空間,就不一次性訪問下一個連續(xù)的空間,這就會導致,在一定程度上的降速。

總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
使用C/C++讀取matlab中.mat格式數(shù)據(jù)的操作
這篇文章給大家介紹了使用C/C++讀取matlab中.mat格式數(shù)據(jù)的操作,文中通過圖文結合的方式介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2023-12-12
Qt5中QML自定義環(huán)形菜單/環(huán)形選擇框的實現(xiàn)
本文主要介紹了Qt5中QML自定義環(huán)形菜單/環(huán)形選擇框的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
C++實現(xiàn)保存數(shù)據(jù)至EXCEL
這篇文章主要介紹了C++實現(xiàn)保存數(shù)據(jù)至EXCEL,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11

