最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入了解一下C語言中的柔性數(shù)組

 更新時(shí)間:2023年02月13日 11:00:17   作者:Jambo!  
柔性數(shù)組是在C99中定義的,即結(jié)構(gòu)體的最后一個(gè)元素允許是未知大小的數(shù)組,這就叫柔性數(shù)組。這篇文章將通過簡單的示例為大家介紹一下柔性數(shù)組的使用,感興趣的可以了解一下

什么是柔性數(shù)組

柔性數(shù)組是在C99中定義的

結(jié)構(gòu)體的最后一個(gè)元素允許是未知大小的數(shù)組,這就叫柔性數(shù)組

柔性數(shù)組的長度可以寫成0,也可以不規(guī)定數(shù)組長度

下面兩種寫法都是正確的

struct S
{
int i;
int a[0];//柔性數(shù)組成員
}
struct S
{
int i;
int a[];//柔性數(shù)組成員
}
  • 結(jié)構(gòu)體中的柔性數(shù)組成員前面至少有一個(gè)其他成員
  • sizeof返回的這種結(jié)構(gòu)體的大小不包括柔性數(shù)組的大小
  • 包含柔性數(shù)組成員的結(jié)構(gòu)體用malloc ()函數(shù)進(jìn)行內(nèi)存的動(dòng)態(tài)分配,并且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大
    小,以適應(yīng)柔性數(shù)組的預(yù)期大小。

柔性數(shù)組的使用

typedef struct S
{
	int i;
	char c[];//c是柔性數(shù)組
}S;

int main()
{
	S* p = (S*)malloc(sizeof(S) + 10 * sizeof(char));
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	p->i = 10;
	for (int i = 0; i < 10; i++)
	{
		p->c[i] = 'a';
	}
	free(p);
	p = NULL;
	return 0;
}

在malloc開辟空間時(shí),開辟空間大小為sizeof(S) + 10 * sizeof(char),前面的sizeof(S)其實(shí)是表示結(jié)構(gòu)體中int i的大小,后面則是給c開辟了10個(gè)字節(jié)大小的連續(xù)空間

如果覺得前面開辟空間小了,數(shù)組c不夠長,還可以用realloc函數(shù)對內(nèi)存大小進(jìn)行調(diào)整

int main()
{
	S* p = (S*)malloc(sizeof(S) + 10 * sizeof(char));
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	p->i = 10;
	
	S* ptr = (S*)realloc(p, sizeof(S) + 20 * sizeof(char));
	if (ptr == NULL)
	{
		perror("realloc");
		return 1;
	}
	p = ptr;
	for (int i = 0; i < 20; i++)
	{
		p->c[i] = 'a';
	}

	free(p);
	p = NULL;
	return 0;
}

其實(shí)我們也可以寫出另一種形式的結(jié)構(gòu)體,它的功能與柔性數(shù)組類似

typedef struct S2
{
    it i;
    char* c;
}S2;

對于這個(gè)結(jié)構(gòu)體的使用如下:

int main()
{
	S2* p = (S2*)malloc(sizeof(S2));
	p->i = 10;
	p->c = (char*)malloc(10 * sizeof(char));
	for (int i = 0; i < 10; i++)
	{
		p->c[i] = 'a';
	}

	free(p->c);
	p->c = NULL;
	free(p);
	p = NULL;

	return 0;
}

為了使用這個(gè)結(jié)構(gòu)體,需要先給結(jié)構(gòu)體開辟一個(gè)空間S2* p = (S2*)malloc(sizeof(S2));然后再需要?jiǎng)討B(tài)開辟一個(gè)塊空間讓c指向

這種寫法需要開辟2次內(nèi)存,同樣在最后釋放內(nèi)存是,也需要free2次

所以就可以看出柔性數(shù)組的好處:

第 一個(gè)是方便內(nèi)存釋放

因?yàn)椴徽撌俏覀冊谑褂脮r(shí)或給別人寫一個(gè)函數(shù)讓別人使用時(shí),如果在里面做了二次內(nèi)存分配,可能別人使用時(shí)并不會(huì)知道結(jié)構(gòu)體內(nèi)部還有一個(gè)成員需要釋放。所以就需要把內(nèi)存一次性分配好,在最后釋放一次內(nèi)存就可以了

第二個(gè)是加快訪問

如果二次內(nèi)存分配,就會(huì)在內(nèi)存中產(chǎn)生一些內(nèi)存碎片,這樣即浪費(fèi)了空間也不利于訪問

到此這篇關(guān)于深入了解一下C語言中的柔性數(shù)組的文章就介紹到這了,更多相關(guān)C語言柔性數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++11 lambda表達(dá)式在回調(diào)函數(shù)中的使用方式

    C++11 lambda表達(dá)式在回調(diào)函數(shù)中的使用方式

    這篇文章主要介紹了C++11 lambda表達(dá)式在回調(diào)函數(shù)中的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++11的新特性簡單匯總介紹 (二)

    C++11的新特性簡單匯總介紹 (二)

    最近學(xué)習(xí)了C++11的新特性,將學(xué)習(xí)內(nèi)容整理下來以鞏固記憶,這里分享給大家,希望對大家學(xué)習(xí)C++11能夠有所幫助
    2016-07-07
  • C語言實(shí)現(xiàn)掃雷小游戲詳細(xì)代碼

    C語言實(shí)現(xiàn)掃雷小游戲詳細(xì)代碼

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)掃雷小游戲的代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 構(gòu)建mfc窗體的簡單示例

    構(gòu)建mfc窗體的簡單示例

    這篇文章主要介紹了構(gòu)建mfc窗體的簡單示例,需要的朋友可以參考下
    2014-04-04
  • C語言刷題判斷鏈表中是否有環(huán)題解

    C語言刷題判斷鏈表中是否有環(huán)題解

    這篇文章主要為大家介紹了C語言刷題判斷鏈表中是否有環(huán)題解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • C語言時(shí)間函數(shù)之mktime和difftime詳解

    C語言時(shí)間函數(shù)之mktime和difftime詳解

    這篇文章主要為大家詳細(xì)介紹了C語言時(shí)間函數(shù)之mktime和difftime,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一,希望能夠給你帶來幫助
    2022-02-02
  • C語言熱門考點(diǎn)結(jié)構(gòu)體與內(nèi)存對齊詳解

    C語言熱門考點(diǎn)結(jié)構(gòu)體與內(nèi)存對齊詳解

    在掌握基本的結(jié)構(gòu)體使用后,我們在面試和大型比賽中常常會(huì)遇到一個(gè)熱門考點(diǎn):結(jié)構(gòu)體內(nèi)存對齊,也就是計(jì)算結(jié)構(gòu)體大小。接下來請跟著筆者一起來學(xué)習(xí)這塊知識(shí)點(diǎn)吧
    2021-10-10
  • opencv利用矩形框選中某一區(qū)域并保存為新圖片

    opencv利用矩形框選中某一區(qū)域并保存為新圖片

    這篇文章主要為大家詳細(xì)介紹了opencv利用矩形框選中某一區(qū)域并保存為新圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C語言操作符基礎(chǔ)知識(shí)詳解

    C語言操作符基礎(chǔ)知識(shí)詳解

    這篇文章主要以圖文結(jié)合的方式為大家詳細(xì)介紹了C語言位運(yùn)算基礎(chǔ)知識(shí),感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-10-10
  • OpenCV實(shí)現(xiàn)高斯噪聲

    OpenCV實(shí)現(xiàn)高斯噪聲

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)高斯噪聲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評論

潞西市| 丹阳市| 朝阳县| 府谷县| 开江县| 葫芦岛市| 昂仁县| 武胜县| 彝良县| 平乡县| 新竹市| 塔河县| 惠安县| 北京市| 苗栗市| 什邡市| 米林县| 永新县| 怀来县| 定州市| 凭祥市| 清新县| 开平市| 长沙市| 松溪县| 岳普湖县| 双流县| 旌德县| 淳化县| 天津市| 双峰县| 青岛市| 兴文县| 化隆| 额济纳旗| 卢龙县| 德清县| 游戏| 淮滨县| 望都县| 永清县|