C語(yǔ)言中的柔性數(shù)組你真的了解嗎
柔性數(shù)組概念:
柔性數(shù)組就是一種特殊的數(shù)組
它也是結(jié)構(gòu)體最后一個(gè)成員
也就是說(shuō),它存在結(jié)構(gòu)體最后一個(gè)成員的位置上
特點(diǎn):
1.柔性數(shù)組在結(jié)構(gòu)體的大小是未知的,在sizeof中不計(jì)算其大小
#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ù)組,就必須滿足它的前面含有其它的成員,來(lái)申請(qǐng)空間,,因?yàn)樗拇笮”旧硎俏粗?,不?jì)算大小。
3.包含柔性數(shù)組的結(jié)構(gòu)體要靠malloc去動(dòng)態(tài)申請(qǐng)這塊空間,這就體現(xiàn)了柔性數(shù)組的柔,也就是可以控制大小,且分配的空間一定滿足大于其它成員的大小。
與指針動(dòng)態(tài)開(kāi)辟的比較
在日常的編程中,有時(shí)候需要在結(jié)構(gòu)體中存放一個(gè)長(zhǎng)度動(dòng)態(tài)的數(shù)組
一般的做法,是在結(jié)構(gòu)體中定義一個(gè)指針成員,這個(gè)指針成員指向該數(shù)組所在的動(dòng)態(tài)內(nèi)存空間
指針動(dòng)態(tài)開(kā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;
}
通過(guò)柔性數(shù)組來(lái)實(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);
//使用
//改變申請(qǐng)的空間
struct S* tmp= (struct S*)realloc(ps, sizeof(struct S)+80);
if (tmp == NULL)
{
return;
}
if (tmp != NULL)
{
ps = tmp;
}
return 0;
}

指針動(dòng)態(tài)開(kāi)辟的缺點(diǎn)
1.此方式會(huì)多次進(jìn)行開(kāi)辟于釋放動(dòng)態(tài)申請(qǐng)的空間,就容易會(huì)導(dǎo)致錯(cuò)誤
2.容易出現(xiàn)內(nèi)存碎片
當(dāng)指針動(dòng)態(tài)開(kāi)辟的足夠多的時(shí)候,中間就會(huì)出現(xiàn)很多內(nèi)存碎片,每個(gè)內(nèi)存碎片不連續(xù)
就會(huì)導(dǎo)致空間的浪費(fèi)

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

總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- C語(yǔ)言初識(shí)動(dòng)態(tài)內(nèi)存管理malloc calloc realloc free函數(shù)
- C語(yǔ)言中動(dòng)態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)解析
- C語(yǔ)言?柔性數(shù)組的使用詳解
- 詳解C語(yǔ)言之柔性數(shù)組
- C語(yǔ)言中動(dòng)態(tài)內(nèi)存管理圖文詳解
- c語(yǔ)言詳解動(dòng)態(tài)內(nèi)存分配及常見(jiàn)錯(cuò)誤的解決
- C語(yǔ)言動(dòng)態(tài)內(nèi)存管理malloc柔性數(shù)組示例詳解
相關(guān)文章
C++返回值是類(lèi)名和返回值是引用的區(qū)別及說(shuō)明
這篇文章主要介紹了C++返回值是類(lèi)名和返回值是引用的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
C++ 自由存儲(chǔ)區(qū)是否等價(jià)于堆你知道嗎
自由存儲(chǔ)是C++中通過(guò)new與delete動(dòng)態(tài)分配和釋放對(duì)象的抽象概念,而堆(heap)是C語(yǔ)言和操作系統(tǒng)的術(shù)語(yǔ),是操作系統(tǒng)維護(hù)的一塊動(dòng)態(tài)分配內(nèi)存2021-08-08
詳解C++ 多態(tài)的實(shí)現(xiàn)及原理
這篇文章主要介紹了C++ 多態(tài)的實(shí)現(xiàn)及原理,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05
使用C/C++讀取matlab中.mat格式數(shù)據(jù)的操作
這篇文章給大家介紹了使用C/C++讀取matlab中.mat格式數(shù)據(jù)的操作,文中通過(guò)圖文結(jié)合的方式介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-12-12
C語(yǔ)言實(shí)現(xiàn)字符串轉(zhuǎn)浮點(diǎn)函數(shù)的示例
字符串不僅可以轉(zhuǎn)換為整數(shù),也可以轉(zhuǎn)換為浮點(diǎn)數(shù),本文主要介紹了C語(yǔ)言實(shí)現(xiàn)字符串轉(zhuǎn)浮點(diǎn)函數(shù)的示例,具有一定的參考價(jià)值,感興趣的可以了解一下2022-02-02
Qt5中QML自定義環(huán)形菜單/環(huán)形選擇框的實(shí)現(xiàn)
本文主要介紹了Qt5中QML自定義環(huán)形菜單/環(huán)形選擇框的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
詳解C語(yǔ)言實(shí)現(xiàn)推箱子的基本功能
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)推箱子的基本功能的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02
C++實(shí)現(xiàn)保存數(shù)據(jù)至EXCEL
這篇文章主要介紹了C++實(shí)現(xiàn)保存數(shù)據(jù)至EXCEL,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

