C語言?柔性數(shù)組的使用詳解
一.柔性數(shù)組的特點
struct S { int x; int a[]; }; int main() { printf("%d", sizeof(S)); }
這段代碼的輸出是什么?
我們打印結(jié)構(gòu)體S所占空間的大小,這個a[]占多少字節(jié)呢?
輸出結(jié)果是4,可一個int類型的x就是4了,a[]去哪了?好奇怪哦。
原來,這是一種柔性數(shù)組。
1.結(jié)構(gòu)體中最后一個元素允許是未知大小的數(shù)組,這個數(shù)組就是柔性數(shù)組。
2.結(jié)構(gòu)中的柔性數(shù)組前面必須有至少一個其他成員。
3.sizeof返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。
4.包含柔數(shù)組成員的結(jié)構(gòu)用malloc函數(shù)進(jìn)行內(nèi)存的動態(tài)分配,且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng)柔性數(shù)組的預(yù)期大小。
二.柔性數(shù)組的使用
1.如何使用柔性數(shù)組
包含柔數(shù)組成員的結(jié)構(gòu)用malloc函數(shù)進(jìn)行內(nèi)存的動態(tài)分配,
且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng)柔性數(shù)組的預(yù)期大小。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> struct S { int x; int a[]; }; int main() { //為柔性數(shù)組a[]開辟了40個字節(jié)的空間 struct S *ps =(struct S*)malloc(sizeof(struct S) + 40); if (ps == NULL) //檢查是否為空指針 { perror("ps"); return 1; } ps->x = 10; int i = 0; for (i = 0; i < 10; i++) { ps->a[i] = i; //數(shù)組使用 } for (i = 0; i < 10; i++) { printf("%d ",ps->a[i]); //數(shù)組打印 } //若覺得40不夠用,可用realloc擴(kuò)容 //如: struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 80); if (ptr == NULL) //檢查是否為空指針 { perror("realloc"); return 1; } else { ps = ptr; } free(ps); //釋放內(nèi)存并置為空指針 ps = NULL; }
2.不用柔性數(shù)組的話有什么代替
我們經(jīng)常用字符串指針來申請空間,
那我們直接給字符串指針malloc一塊空間,不就行了嗎,
為什么還要用柔性數(shù)組呢?
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> struct S { int x; int *a; }; int main() { struct S* ps = (struct S*)malloc(sizeof(struct S) );//為結(jié)構(gòu)體變量x開辟空間 if (ps == NULL) { return 1; } ps->a = (int*)malloc(40); //為字符串指針開辟40個字節(jié)的空間 if (ps->a == NULL) { free(ps); ps = NULL; return 1; } free(ps->a); ps->a = NULL; free(ps); ps = NULL; }
上述代碼確實可以完成相同的功能,
但是柔性數(shù)組相對而言更好。
讓我們來看看柔性數(shù)組的優(yōu)勢。
三.柔性數(shù)組的優(yōu)勢
1.方便內(nèi)存釋放
- 使用柔性數(shù)組我們只用free一次,
- 而使用字符串指針要free兩次,有內(nèi)存泄漏的風(fēng)險
2.提高訪問速度
- 柔性數(shù)組malloc了一次,是連續(xù)的內(nèi)存,
- 有益于提高訪問速度,減少內(nèi)存碎片。
到此這篇關(guān)于C語言 柔性數(shù)組的使用詳解的文章就介紹到這了,更多相關(guān)C語言 柔性數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言rewind與fseek函數(shù)之隨機(jī)讀寫文件的用法詳解
這篇文章主要介紹了C語言rewind與fseek函數(shù)之隨機(jī)讀寫文件的用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09C++中fstream,ifstream及ofstream用法淺析
這篇文章主要介紹了C++中fstream,ifstream及ofstream用法,適合C++初學(xué)者學(xué)習(xí)文件流的操作,需要的朋友可以參考下2014-08-08C/C++實現(xiàn)通訊錄管理系統(tǒng)(附源碼)
這篇文章主要為大家詳細(xì)介紹了如何利用C++實現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-12-12C語言編程之動態(tài)內(nèi)存與柔性數(shù)組的了解
本文是C語言編程篇,這篇文章主要為大家介紹了C語言編程中動態(tài)內(nèi)存的函數(shù)與柔性數(shù)組的特點,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09關(guān)于C++中0是十進(jìn)制還是八進(jìn)制的問題
本篇文章中,小編將為大家介紹關(guān)于C++中0是十進(jìn)制還是八進(jìn)制的問題,有需要的朋友可以參考一下2013-04-04C語言使用setjmp和longjmp實現(xiàn)一個簡單的協(xié)程
這篇文章主要為大家介紹了C語言使用setjmp和longjmp實現(xiàn)一個簡單的協(xié)程過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12C語言實現(xiàn)打印楊輝三角的方法詳細(xì)(三種方法)
楊輝三角是中國古代數(shù)學(xué)的杰出研究成果之一,它把二項式系數(shù)圖形化,把組合數(shù)內(nèi)在的一些代數(shù)性質(zhì)直觀地從圖形中體現(xiàn)出來,是一種離散型的數(shù)與形的結(jié)合。本文將介紹三種可以實現(xiàn)打印楊輝三角的辦法,感興趣的可以試一試2022-01-01