【C語言進(jìn)階】動(dòng)態(tài)內(nèi)存不知道怎么用?當(dāng)然是結(jié)合柔性數(shù)組一起用-創(chuàng)新互聯(lián)

目錄

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、成都小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了突泉免費(fèi)建站歡迎大家使用!

🍊前言🍊:

🥝正文:柔性數(shù)組🥝:

? 1.柔性數(shù)組的特點(diǎn):

? 2.柔性數(shù)組的使用:

? 3.柔性數(shù)組的優(yōu)勢(shì):

🍒總結(jié)🍒:


🛰?博客主頁:??鑾同學(xué)的干貨分享基地

🛰?歡迎關(guān)注:👍點(diǎn)贊🙌收藏??留言

🛰?系列專欄:💐【進(jìn)階】C語言學(xué)習(xí)

🛰?代碼倉庫:🎉VS2022_C語言倉庫

? 家人們更新不易,你們的👍點(diǎn)贊👍和👉關(guān)注👈真的對(duì)我真重要,各位路過的友友麻煩多多點(diǎn)贊關(guān)注,歡迎你們的私信提問,感謝你們的轉(zhuǎn)發(fā)!

?關(guān)注我,關(guān)注我,關(guān)注我,你們將會(huì)看到更多的優(yōu)質(zhì)內(nèi)容?。?/p>


🏡🏡本文重點(diǎn)🏡🏡:

🚅柔性數(shù)組特點(diǎn)🚃柔性數(shù)組使用🚃柔性數(shù)組優(yōu)勢(shì)🚏🚏

🍊前言🍊:

? 在上一篇文章中,我們通過幾個(gè)函數(shù)的使用,實(shí)現(xiàn)了對(duì)動(dòng)態(tài)內(nèi)存空間的創(chuàng)建、修改和釋放,使我們的內(nèi)存空間成功的“ 動(dòng)態(tài) ”了起來,而今天我們將通過柔性數(shù)組的介紹和使用,真正讓我們的動(dòng)態(tài)內(nèi)存空間得以應(yīng)用。

🥝正文:柔性數(shù)組🥝:

? 或許很多人,甚至包括一些已經(jīng)參加工作了的老程序員,都未曾聽過柔性數(shù)組(flexible array)這個(gè)概念,但是它又是確實(shí)存在的,并且它的存在對(duì)于我們進(jìn)行動(dòng)態(tài)內(nèi)存管理有著巨大的作用。在 C99 標(biāo)準(zhǔn)中,結(jié)構(gòu)中的最后一個(gè)元素的大小允許是位置大小的數(shù)組,而我們就將這個(gè)未知大小的數(shù)組稱為柔性數(shù)組,并將這個(gè)數(shù)組成員稱為柔性數(shù)組成員:

typedef struct A
{
	int a;
	int arr1[0];
	//柔性數(shù)組成員
}A;

typedef struct B
{
	int b;
	int arr2[];
	//柔性數(shù)組成員
}B;
? 1.柔性數(shù)組的特點(diǎn):

? 根據(jù)上面我們說到的柔性數(shù)組定義,我們可以得知,柔性數(shù)組主要有以下 3 個(gè)特點(diǎn):

①. 結(jié)構(gòu)中的柔性數(shù)組成員前面必須至少存在一個(gè)其他成員。

②. sizeof 返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。

③. 包含柔性數(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ù)組只能作為結(jié)構(gòu)的最后一個(gè)元素,并且柔性數(shù)組的大小是不確定的,因此在結(jié)構(gòu)中,柔性數(shù)組之前至少要有一個(gè)其它成員的存在。

? 因?yàn)槿嵝詳?shù)組的大小是未知的,因此在計(jì)算結(jié)構(gòu)大小時(shí),將不會(huì)計(jì)入柔性數(shù)組的大小:

typedef struct test
{
	int i;
	int arr[];
}test;

int main()
{
	test a;
	printf("The size of a is :%d\n", sizeof(a));

	return 0;
}

? 例如上述代碼的編譯運(yùn)行結(jié)果顯示,類型 a 的大小為 4 個(gè)字節(jié),即只包含成員整形變量 i:

? 因?yàn)槿嵝詳?shù)組的大小是未知的,因此其大小是動(dòng)態(tài)、可變的,故在給其分配空間時(shí),應(yīng)當(dāng)使用 malloc 函數(shù)進(jìn)行動(dòng)態(tài)內(nèi)存分配。同時(shí)因?yàn)橛?jì)算結(jié)構(gòu)大小時(shí)沒有計(jì)入柔性數(shù)組的大小,因此分配的內(nèi)存大小應(yīng)當(dāng)大于結(jié)構(gòu)的大小,才能容納下柔性數(shù)組的預(yù)期大小:

typedef struct test
{
	int i;
	int arr[];
}test;

int main()
{
	test a;
	//定義test類型結(jié)構(gòu)體a

	test* p = (test*)malloc(sizeof(test) + 40);
	//結(jié)構(gòu)的大小為sizeof(test)的大小,故開辟的動(dòng)態(tài)內(nèi)存大小應(yīng)當(dāng)大于該值

	free(p);
	p = NULL;

	return 0;
}
? 2.柔性數(shù)組的使用:

? 有了上節(jié)課動(dòng)態(tài)內(nèi)存管理函數(shù)的學(xué)習(xí),再來研究柔性數(shù)組的使用就十分簡(jiǎn)單了,我們直接來看示例:

typedef struct test
{
	int i;
	int arr[];
}test;

int main()
{
	test a;
	//定義test類型結(jié)構(gòu)體a

	test* p = (test*)malloc(sizeof(test) + 40);
	//malloc函數(shù)的返回值為指針類型,故使用結(jié)構(gòu)體指針test*
	//使用malloc函數(shù)動(dòng)態(tài)分配空間:test類型結(jié)構(gòu)體的大小(不包含柔性數(shù)組) + 40字節(jié)
	if (p == NULL)
	{
		perror("malloc");
		//判斷動(dòng)態(tài)內(nèi)存空間是否開辟成功
		return 1;
	}

	//業(yè)務(wù)處理1:
	p->i = 10;
	int i = 0;
	//給柔性數(shù)組元素賦值:
	for (i = 0; i< p->i; i++)
	{
		p->arr[i] = i;
	}
	//打印柔性數(shù)組元素:
	for(i=0;ii;i++)
	{
		printf("%d ", p->arr[i]);
	}
	printf("\n");

	test* pp = (test*)realloc(p, sizeof(test) + 80);
	//使用realloc函數(shù)將結(jié)構(gòu)指針指向的結(jié)構(gòu)a進(jìn)行擴(kuò)容
	if (pp == NULL)
	{
		perror("realloc");
		//判斷動(dòng)態(tài)內(nèi)存空間是否擴(kuò)容成功
		return 1;
	}

	//業(yè)務(wù)處理2:
	pp->i = 20;
	for (i = 0; i< pp->i; i++)
	{
		pp->arr[i] = i + 9;
	}
	for (i = 0; i< pp->i; i++)
	{
		printf("%d ", pp->arr[i]);
	}
	printf("\n");

	free(pp);
	pp = NULL;

	return 0;
}

? 在這個(gè)示例中,我們首先定義了 test 類型結(jié)構(gòu)體 a,接著使用了 malloc 函數(shù)為結(jié)構(gòu)體 a 與柔性數(shù)組分配了動(dòng)態(tài)存儲(chǔ)空間;接著在判斷非空(動(dòng)態(tài)內(nèi)存空間分配成功)后給結(jié)構(gòu)體成員 i 與柔性數(shù)組 arr 內(nèi)元素賦值,并進(jìn)行了打印;再接下來,我們通過使用 realloc 函數(shù)將包含柔性數(shù)組 arr 的結(jié)構(gòu)體 a 擴(kuò)容,并在擴(kuò)容后給結(jié)構(gòu)體內(nèi)各成員重新賦值并打??;最后釋放使用完畢的動(dòng)態(tài)內(nèi)存空間并將指針置空:

? 3.柔性數(shù)組的優(yōu)勢(shì):

? 但是同時(shí)我們又發(fā)現(xiàn),我們使用柔性數(shù)組的目的在于希望使結(jié)構(gòu)成員的空間變?yōu)閯?dòng)態(tài),可大可小,那么為什么我們不將其寫成指針,由指針成員來指向其它的空間呢?如下:

typedef struct test
{
	int i;
	int* p;
}test;

int main()
{
	test* ptr = (test*)malloc(sizeof(test));
	if (ptr == NULL)
	{
		perror("malloc");
		return 1;
	}
	ptr->p = (int*)malloc(40);
	if (ptr->p == NULL)
	{
		free(ptr);
		ptr = NULL;
		return 1;
	}

	return 0;
}

? 我們說,這兩種方法都可以達(dá)到我們的要求,實(shí)現(xiàn)我們的目的,完成同樣的功能。但是使用柔性數(shù)組有兩個(gè)顯著的好處:

★ 方便內(nèi)存釋放。

★?有利于提升訪問速度。

★ 有利于減少內(nèi)存碎片。

? 使用柔性數(shù)組的第一個(gè)好處是方便于內(nèi)存釋放。我們可以想象一下,假如是在我們的程序之中,用戶在完成結(jié)構(gòu)體調(diào)用后,可以調(diào)用 free 函數(shù)將結(jié)構(gòu)體空間進(jìn)行釋放,那么這個(gè)時(shí)候,下面這種方法進(jìn)行了二次空間分配,即使用指針指向了另一塊動(dòng)態(tài)內(nèi)存空間,我們不能依賴于用戶去發(fā)現(xiàn)還有另外一塊動(dòng)態(tài)內(nèi)存空間需要及時(shí)進(jìn)行釋放,一旦用戶沒有注意,就有可能會(huì)造成內(nèi)存釋放不及時(shí),嚴(yán)重時(shí)甚至有可能會(huì)導(dǎo)致內(nèi)存泄漏問題的產(chǎn)生。反觀使用柔性數(shù)組,只需調(diào)用一次 free 函數(shù)即可完成內(nèi)存空間的釋放。

? 使用柔性數(shù)組的第二個(gè)優(yōu)勢(shì)在于,可以在一定程度上提升我們的內(nèi)存訪問速度。上面這種方式在進(jìn)行內(nèi)存訪問時(shí),由于使用了二次空間分配,則在訪問時(shí)的尋址過程中就需要花費(fèi)更多的時(shí)間,而如果我們使用了柔性數(shù)組,由于開辟的空間是連續(xù)的,在尋址時(shí)便可以節(jié)省一定的時(shí)間。

? 最后一個(gè)優(yōu)點(diǎn)是,有利于減少內(nèi)存碎片。這個(gè)很好理解,使用二次內(nèi)存分配的方式所申請(qǐng)到的空間是不連續(xù)的,就會(huì)在內(nèi)存中產(chǎn)生更多的空隙,就會(huì)導(dǎo)致內(nèi)存空間中產(chǎn)生更多的內(nèi)存碎片,而使用柔性數(shù)組所申請(qǐng)的空間是連續(xù)的,則作為一個(gè)個(gè)整體,就可以減少內(nèi)存碎片的產(chǎn)生了。

🍒總結(jié)🍒:

加上今天內(nèi)容的學(xué)習(xí),我們就可以將動(dòng)態(tài)內(nèi)存空間靈活的運(yùn)用在我們的程序代碼之中了。并且通過使用并管理動(dòng)態(tài)內(nèi)存空間,還可以提高我們代碼及程序的靈活性和執(zhí)行效率,有助于我們寫出更加優(yōu)秀的程序。所以,掌握好動(dòng)態(tài)內(nèi)存的管理與柔性數(shù)組的使用,對(duì)于我們的工作中的許多項(xiàng)目都大有裨益,希望各位小伙伴們下去以后能夠多加練習(xí),切實(shí)掌握動(dòng)態(tài)內(nèi)存管理與柔性數(shù)組的相關(guān)知識(shí)。

🔥🔥有的路,你必須一個(gè)人走,這是選擇而非孤獨(dú)🔥🔥

更新不易,辛苦各位小伙伴們動(dòng)動(dòng)小手,👍三連走一走💕💕 ~ ~ ~? 你們真的對(duì)我很重要!最后,本文仍有許多不足之處,歡迎各位認(rèn)真讀完文章的小伙伴們隨時(shí)私信交流、批評(píng)指正!

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

本文名稱:【C語言進(jìn)階】動(dòng)態(tài)內(nèi)存不知道怎么用?當(dāng)然是結(jié)合柔性數(shù)組一起用-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://bm7419.com/article12/dioedc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、ChatGPT、網(wǎng)站內(nèi)鏈、網(wǎng)站營銷標(biāo)簽優(yōu)化、營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司