【進(jìn)階C語言】動態(tài)內(nèi)存管理+柔性數(shù)組-創(chuàng)新互聯(lián)

文章目錄
    • 1.動態(tài)內(nèi)存的開辟
      • 內(nèi)存的布局
      • 內(nèi)存池
      • 內(nèi)存碎片
      • 內(nèi)存泄漏
    • 2.動態(tài)內(nèi)存函數(shù)
      • malloc
        • 功能
        • 函數(shù)
      • calloc
        • 功能
        • 函數(shù)
      • realloc
        • 功能
        • 函數(shù)
        • 開辟時遇到的兩種情況
      • free
        • 功能
        • 函數(shù)
    • 3. ?建議
    • 4.柔性數(shù)組
      • 特性:
      • 定義
      • 使用
      • 優(yōu)點

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、成都網(wǎng)站制作、遼陽縣網(wǎng)絡(luò)推廣、小程序設(shè)計、遼陽縣網(wǎng)絡(luò)營銷、遼陽縣企業(yè)策劃、遼陽縣品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎;創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供遼陽縣建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn1.動態(tài)內(nèi)存的開辟 內(nèi)存的布局

在這里插入圖片描述
我們常用的內(nèi)存開辟函數(shù)都是在堆區(qū)開辟的——malloc,calloc,realloc,free。

內(nèi)存池
  1. 定義
    ?內(nèi)存池(Memory Pool)是一種內(nèi)存分配方式。
  2. 優(yōu)點
    ?內(nèi)存池則是在真正使用內(nèi)存之前,預(yù)先申請分配一定數(shù)量、大小相等(一般情況下)的內(nèi)存塊留作備用。當(dāng)有新的內(nèi)存需求時,就從內(nèi)存池中分出一部分內(nèi)存塊,若內(nèi)存塊不夠再繼續(xù)申請新的內(nèi)存。這樣做的一個顯著優(yōu)點是,使得內(nèi)存分配效率得到提升。

注意:這里的提升是一定程度上的,不一定效率提升很大。

內(nèi)存碎片

定義
?內(nèi)存碎片即“碎片的內(nèi)存”描述一個系統(tǒng)中所有不可用的空閑內(nèi)存,這些碎片之所以不能被使用,是因為負(fù)責(zé)動態(tài)分配內(nèi)存的分配算法使得這些空閑的內(nèi)存無法使用,這一問題的發(fā)生,原因在于這些空閑內(nèi)存以小且不連續(xù)方式出現(xiàn)在不同的位置。
簡單來說:就是一些比較小且無法進(jìn)行利用的內(nèi)存空間。

內(nèi)存泄漏

定義:
?內(nèi)存泄漏(Memory Leak)是指程序中已動態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無法釋放,造成系統(tǒng)內(nèi)存的浪費,導(dǎo)致程序運行速度減慢甚至系統(tǒng)崩潰等嚴(yán)重后果。

程序結(jié)束時,會將占用的內(nèi)存還給操作系統(tǒng),但是如果有一個不停運行的程序呢?如果在運行時所占用的內(nèi)存空間無法及時的釋放,則可能在一段時間后,程序死機(jī)或者運行緩慢,這就是我們電腦死機(jī)重啟恢復(fù)正常的原因。那如果我們將用完的內(nèi)存及時的還給操作系統(tǒng),這樣我們的程序,在理論上,具有了持續(xù)運行的能力。

2.動態(tài)內(nèi)存函數(shù) malloc 功能

向內(nèi)存申請一塊連續(xù)可用的空間,并返回指向這塊空間的指針。

返回的指針建議強(qiáng)制類型轉(zhuǎn)換為所使用指針的類型,因為返回的類型是void*的指針,容易報出警告。

函數(shù)

1.返回類型:void*
2.參數(shù)
要開辟的字節(jié)個數(shù)——size_t

注意:
1.開辟失敗,則返回一個空指針,空指針是不能被解引用的,要進(jìn)行檢查以免出錯。
2.開辟成功,則返回指向該空間首位置的指針。
3.如果參數(shù) size 為0,malloc的行為是標(biāo)準(zhǔn)是未定義的,取決于編譯器。
4.用完的函數(shù)要及時的還給操作系統(tǒng)。

calloc 功能

與malloc的功能相似,向內(nèi)存申請一塊連續(xù)可用的空間,并且設(shè)置初始值,并返回指向這塊空間的指針。

函數(shù)

1.返回類型:void*
2.參數(shù)

1.要開辟的類型個數(shù)——size_t
2.要開辟的類型字節(jié)個數(shù)——size_t
3.其它的注意事項與malloc基本相同
4.由于需要初始化所以calloc要比malloc的效率稍微低一點

realloc 功能

不夠使用的內(nèi)存空間重新開辟,進(jìn)行增容。

函數(shù)

1.返回類型:void*
2.參數(shù)

1.要調(diào)整的內(nèi)存空間的地址——void*
2.要申請的比原先更大的字節(jié)數(shù)——size_t

開辟時遇到的兩種情況

在這里插入圖片描述

這個函數(shù)考慮的很周到:
情況一:返回的是原先的地址
情況二:將原先不夠的空間進(jìn)行釋放,還給操作系統(tǒng),,同時返回的是開辟好的空間的地址。

free 功能

將在堆區(qū)開辟的已經(jīng)使用過的空間返還給操作系統(tǒng),經(jīng)常與上面的內(nèi)存開辟函數(shù)進(jìn)行搭配著使用。

注意:
1.其它區(qū)上可不能用free
2.free過后的空間指針并沒有被置為空指針,要手動置為空指針
3.在傳入NULL時,free啥也不干。
4.對已經(jīng)釋放的空間的起始位置再一次釋放會報錯,所以要及時置為空指針。

函數(shù)

1.返回類型:void
2.參數(shù)
要釋放空間位置的起始地址——void*

3. ?建議

1.對接收的指針要進(jìn)行檢查,防止其為空指針
2.對釋放后的指針?biāo)赶虻目臻g后,將指針及時的置為NULL,防止報錯。
3.free的范圍僅限在堆區(qū)所開辟的空間使用
4.注意使用指針的越界問題
5.動態(tài)內(nèi)存函數(shù)的開辟尤其是在函數(shù)內(nèi)部開辟時,要及時的在函數(shù)內(nèi)部置為空指針,否則這塊開辟的空間將無法進(jìn)行正常的使用,會導(dǎo)致內(nèi)存泄漏的問題。

4.柔性數(shù)組 特性:

?它允許你在定義結(jié)構(gòu)體時創(chuàng)建一個空數(shù)組,而這個數(shù)組的大小可以在程序運行的過程中根據(jù)你的需求進(jìn)行更改特別注意的一點是,并且還要求這樣的結(jié)構(gòu)體至少包含一個其他類型的成員,這個空數(shù)組必須聲明為結(jié)構(gòu)體的最后一個成員

注意:
1.在結(jié)構(gòu)體里面才能出現(xiàn)柔性數(shù)組
2.結(jié)構(gòu)中的柔性數(shù)組成員前面必須至少一個其他成員。
3. 包含柔性數(shù)組成員的結(jié)構(gòu)用malloc ()函數(shù)進(jìn)行內(nèi)存的動態(tài)分配,并且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng)柔性數(shù)組的預(yù)期大小。
4.這個空數(shù)組必須聲明為結(jié)構(gòu)體的最后一個成員

定義

法1:

typedef struct st_type
{int i;
int a[0];//柔性數(shù)組成員
}type_a;
printf("%d\n", sizeof(type_a));//輸出的是4

法2:

typedef struct st_type
{int i;
int a[];//柔性數(shù)組成員
}type_a;
printf("%d\n", sizeof(type_a));//輸出的是4
使用
typedef struct st_type
{int i;
int a[];//柔性數(shù)組成員
}type_a;
int main()
{int i = 0;
	type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));
	//如果不夠使用realloc進(jìn)行增容
	for(i=0; i<100; i++)
	{  p->a[i] = i;
	}
	free(p);
	p=NULL;
	return 0;
}
優(yōu)點

看與之功能相似的代碼:

typedef struct st_type
{int i;
	int *p_a;//指針可以指向開辟空間的地址
}type_a;//此結(jié)構(gòu)體的大小是固定的——32位8字節(jié)/64位12字節(jié)
int main()
{type_a *p = (type_a *)malloc(sizeof(type_a));
	p->i = 100;
	p->p_a = (int *)malloc(p->i*sizeof(int));
	return 0;
}

為了與柔型數(shù)組的功能靠攏,我們將空間都開辟在堆區(qū)上。
接下來我們畫圖來看這個代碼:
在這里插入圖片描述
再看一下柔性數(shù)組的實現(xiàn)圖解:
在這里插入圖片描述
對比看:

區(qū)別:一個是一塊一塊的開辟,另一個是整塊的開辟。
聯(lián)想到內(nèi)存池和內(nèi)存碎片的概念,我們會發(fā)現(xiàn)柔型數(shù)組符合內(nèi)存池的概念,占用一整塊空間,會在一定程度上提高內(nèi)存的使用效率,而模擬的那個會導(dǎo)致內(nèi)存碎片的不斷積累從而會降低內(nèi)存的利用效率。
并且在內(nèi)存釋放的時候一個釋放兩次,這樣可能會導(dǎo)致忘記釋放的毛病,從而導(dǎo)致內(nèi)存泄漏,而柔型數(shù)組只需釋放一次,這樣會使代碼的使用效率變高。

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

當(dāng)前標(biāo)題:【進(jìn)階C語言】動態(tài)內(nèi)存管理+柔性數(shù)組-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://muchs.cn/article34/dejdpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站App開發(fā)、網(wǎng)站設(shè)計網(wǎng)站排名虛擬主機(jī)、網(wǎng)站維護(hù)

廣告

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

綿陽服務(wù)器托管