成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【C語(yǔ)言】動(dòng)態(tài)內(nèi)存分配

helloworldcoding / 1412人閱讀

摘要:一動(dòng)態(tài)內(nèi)存的函數(shù)和頭文件功能向堆區(qū)申請(qǐng)一塊大小為的連續(xù)的空間,并返回該空間的起始地址。若指向的不是動(dòng)態(tài)分配的內(nèi)存,函數(shù)的行為標(biāo)準(zhǔn)未定義,取決于編譯器。


??? 常規(guī)開(kāi)辟空間的方式,開(kāi)辟出空間的大小是固定的(尤其是數(shù)組的開(kāi)辟需要預(yù)先給定空間),而動(dòng)態(tài)內(nèi)存分配可以解決這個(gè)問(wèn)題。

一、動(dòng)態(tài)內(nèi)存的函數(shù)

??? 1.1 malloc和free

1?? malloc:

void* malloc (size_t size);

??? 頭文件stdlib.h
??? 功能:向堆區(qū)申請(qǐng)一塊大小為size連續(xù)的空間,并返回該空間的起始地址。

  • 申請(qǐng)成功,返回該空間的指針。
  • 申請(qǐng)失敗,返回NULL。

?注意
??? ① 返回值的類型是 void* ,所以malloc函數(shù)并不知道開(kāi)辟空間的類型,具體在使用的時(shí)候使用者自己來(lái)決定。

//eg.int* p = (int*)malloc(40);//強(qiáng)制類型轉(zhuǎn)換為int*

??? ② 如果參數(shù) size0,malloc的行為是標(biāo)準(zhǔn)是未定義的,取決于編譯器。

2?? free:

void free (void* ptr);

??? 功能:釋放動(dòng)態(tài)開(kāi)辟的內(nèi)存。

?注意
??? ① 若ptr指向的是NULL,函數(shù)啥也不做。
??? ② 若ptr指向的不是動(dòng)態(tài)分配的內(nèi)存,free函數(shù)的行為標(biāo)準(zhǔn)未定義,取決于編譯器。

//egint main(){	int num = 0;	scanf("%d", &num);	int* ptr = NULL;	ptr = (int*)malloc(num * sizeof(int));//動(dòng)態(tài)開(kāi)辟空間	if (NULL != ptr)//是否開(kāi)辟成功	{		int i = 0;		for (i = 0; i < num; i++)		{			*(ptr + i) = 0;		}	}	free(ptr);//釋放ptr所指向的動(dòng)態(tài)內(nèi)存	//雖然free將空間釋放但是ptr還可以找到那塊空間,所以需要將ptr置NULL	ptr = NULL;	return 0;}

Summary:
mallocfree是一對(duì),malloc開(kāi)辟后需要檢測(cè)是否成功,free釋放后需要置NULL。

??? 1.2 calloc

void* calloc (size_t num, size_t size);

??? 功能:向堆區(qū)申請(qǐng)num個(gè)大小為size的空間,并將空間的每一個(gè)字節(jié)初始化為0,返回該空間的起始地址。

//eg.int main(){	int* p = (int*)calloc(10, sizeof(int));	if (NULL != p)	{		//使用空間	}	free(p);	p = NULL;	return 0;}

??? 1.3 realloc

void* realloc (void* ptr, size_t size);

??? 功能:將ptr指向的空間調(diào)整為size大小,返回調(diào)整之后的內(nèi)存起始位置。

?注意:有兩種調(diào)整內(nèi)存空間的情況:
??? ① 原有空間之后有足夠大的空間:在原有空間的基礎(chǔ)上向后延伸,不改變?cè)袛?shù)據(jù)。
??? ② 原有空間之后沒(méi)有足夠大的空間:在堆區(qū)上找一個(gè)連續(xù)的合適空間,返回新空間的起始地址。并將數(shù)據(jù)轉(zhuǎn)移到新地址中,舊地址釋放。

//eg.int main(){	int* ptr = (int*)malloc(100);	if (ptr != NULL)	{		//業(yè)務(wù)處理	}	else	{		exit(EXIT_FAILURE);		//EXIT_FAILURE 可以作為exit ()的參數(shù)來(lái)使用,表示沒(méi)有成功地執(zhí)行一個(gè)程序		//EXIT_SUCCESS 作為exit ()的參數(shù)來(lái)使用,表示成功地執(zhí)行一個(gè)程序	}	//擴(kuò)容	int* p = NULL;	p = realloc(ptr, 1000);//要注意需要新建一個(gè)變量以免開(kāi)辟失敗而造成原地址丟失	if (p != NULL)	{		ptr = p;	}	free(ptr);	ptr = NULL;	return 0;}

Summary:
所有動(dòng)態(tài)內(nèi)存開(kāi)辟后,最好都檢測(cè)一遍是否成功,釋放后都置NULL。

在堆區(qū)申請(qǐng)的空間,有兩種回收方式

  • free
  • 程序退出時(shí),申請(qǐng)的空間被回收

二、常見(jiàn)的錯(cuò)誤

??? 2.1 動(dòng)態(tài)開(kāi)辟后忘記檢測(cè)

//Qvoid test(){	int* p = (int*)malloc(INT_MAX / 4);	*p = 20;//如果p的值是NULL,就會(huì)有問(wèn)題	free(p);	p=NULL;}
//Svoid test(){	int* p = (int*)malloc(INT_MAX / 4);	if (p == NULL)//檢測(cè)是否開(kāi)辟成功	{		exit(EXIT_FAILURE);	}	*p = 20;	free(p);	p=NULL;}

??? 2.2 動(dòng)態(tài)開(kāi)辟后忘記釋放(內(nèi)存泄漏)

//Qvoid test(){	int* p = (int*)malloc(100);	if (NULL != p)	{		*p = 20;	}}int main(){	test();	while (1);}

S:開(kāi)辟的空間在未結(jié)束前,一直被占用,記得free回收,別等程序退出自己回收。

??? 2.3 動(dòng)態(tài)開(kāi)辟空間越界訪問(wèn)

//Qvoid test(){	int i = 0;	int* p = (int*)malloc(10 * sizeof(int));	if (NULL == p)	{		exit(EXIT_FAILURE);	}	for (i = 0; i <= 10; i++)	{		*(p + i) = i;//當(dāng)i是10的時(shí)候越界訪問(wèn)	}	free(p);	p=NULL;}

S:編譯器不能檢測(cè)出,得程序員自己格外注意。

??? 2.4 free釋放非動(dòng)態(tài)開(kāi)辟內(nèi)存

//Qvoid test(){	int a = 10;	int* p = &a;	free(p);//err	p=NULL;}

S:free釋放堆上的空間

??? 2.5 free釋放一部分

void test(){	int* p = (int*)malloc(100);	p++;//p不再指向動(dòng)態(tài)內(nèi)存的起始位置	free(p);//err}

free釋放一塊空間必須提供該空間的起始地址。

??? 2.6 free多次釋放

//Qvoid test(){	int *p = (int *)malloc(100);	free(p);	free(p);//err 重復(fù)釋放}
//Svoid test(){	int *p = (int *)malloc(100);	free(p);	p=NULL;	free(p);//NULL啥都不干	p=NULL;}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/122558.html

相關(guān)文章

  • C語(yǔ)言進(jìn)階】動(dòng)態(tài)內(nèi)存管理/分配

    摘要:棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。棧區(qū)主要存放運(yùn)行函數(shù)而分配的局部變量函數(shù)參數(shù)返回?cái)?shù)據(jù)返回地址等。 C語(yǔ)言動(dòng)態(tài)內(nèi)存分配篇 目錄 一、為什么存在動(dòng)態(tài)內(nèi)存管理/分配? ????????內(nèi)存的存儲(chǔ)形式劃分 二、動(dòng)態(tài)內(nèi)存函數(shù)的介紹 ????????malloc ...

    Carson 評(píng)論0 收藏0
  • 深入理解Redis 數(shù)據(jù)結(jié)構(gòu)—簡(jiǎn)單動(dòng)態(tài)字符串sds

    摘要:本文主要介紹的數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單動(dòng)態(tài)字符串簡(jiǎn)稱。遵守字符串以空字符串結(jié)尾的慣例,保存的空字符串一個(gè)字節(jié)空間不計(jì)算在的屬性里面。添加空字符串到字符串末尾等操作,都是由函數(shù)自動(dòng)完成的,所以這個(gè)空字符對(duì)于使用者來(lái)說(shuō)完全是透明的。Redis是用ANSI C語(yǔ)言編寫(xiě)的,它是一個(gè)高性能的key-value數(shù)據(jù)庫(kù),它可以作用在數(shù)據(jù)庫(kù)、緩存和消息中間件。其中 Redis 鍵值對(duì)中的鍵都是 string 類型,而鍵...

    番茄西紅柿 評(píng)論0 收藏2637
  • C語(yǔ)言進(jìn)階:動(dòng)態(tài)內(nèi)存管理

    摘要:釋放不完全導(dǎo)致內(nèi)存泄漏。既然把柔性數(shù)組放在動(dòng)態(tài)內(nèi)存管理一章,可見(jiàn)二者有必然的聯(lián)系。包含柔性數(shù)組的結(jié)構(gòu)用進(jìn)行動(dòng)態(tài)內(nèi)存分配,且分配的內(nèi)存應(yīng)大于結(jié)構(gòu)大小,以滿足柔性數(shù)組的預(yù)期。使用含柔性數(shù)組的結(jié)構(gòu)體,需配合以等動(dòng)態(tài)內(nèi)存分配函數(shù)。 ...

    shinezejian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<