欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言動(dòng)態(tài)開(kāi)辟內(nèi)存詳解

 更新時(shí)間:2022年02月25日 17:16:13   作者:XATU弟中之弟  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言動(dòng)態(tài)開(kāi)辟內(nèi)存,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

1.動(dòng)態(tài)內(nèi)存管理

我們已經(jīng)掌握的內(nèi)存開(kāi)辟方法,用的最多的就是數(shù)組,但是首先我們知道數(shù)組實(shí)在棧上開(kāi)辟空間的,要是我們開(kāi)辟大量的空間怎么辦呢?而且我不確定數(shù)據(jù)的大小萬(wàn)一造成內(nèi)存資源浪費(fèi)是不是也不劃算呢?所以我認(rèn)為一下兩點(diǎn)就很充分的說(shuō)明動(dòng)態(tài)開(kāi)辟內(nèi)存存在的必要性。

1.一般方式(棧上開(kāi)辟)只能自動(dòng)開(kāi)辟少量的空間,但是堆上可以開(kāi)辟大量的空間。

2.對(duì)于不定長(zhǎng)數(shù)據(jù)保存問(wèn)題,動(dòng)態(tài)開(kāi)辟空間可以解決。

2.動(dòng)態(tài)開(kāi)辟內(nèi)存函數(shù)的介紹

2.1 malloc和free函數(shù)

C語(yǔ)言提供了一個(gè)動(dòng)態(tài)開(kāi)辟內(nèi)存的函數(shù)。

void* malloc (size_t size);

C語(yǔ)言還提供了一個(gè)函數(shù)free是對(duì)動(dòng)態(tài)開(kāi)辟內(nèi)存釋放和回收的。

void free (void* ptr);

這兩個(gè)函數(shù)都聲明在stdlib.h這個(gè)頭文件中

那如何進(jìn)行內(nèi)存的開(kāi)辟與釋放呢?舉個(gè)例子。

int main() {
	int* p = (int*)malloc(10 * sizeof(int));
	if (NULL == p) {
		return 1;
	}
	free(p);
}

1.malloc 等空間申請(qǐng)都是在堆上進(jìn)行申請(qǐng),最后必須由free來(lái)進(jìn)行釋放。堆上的空間是由程序員自己管理。

2.malloc是一個(gè)函數(shù),表明了堆空間說(shuō)在程序運(yùn)行起來(lái)之后,再在系統(tǒng)上申請(qǐng)的,空間只申請(qǐng)不釋放,會(huì)造成內(nèi)存泄露問(wèn)題!

3.那free是做了什么呢?他是把開(kāi)辟的空間給清除了?還是把指針給清空了?

其實(shí)都不是,free做的是取消了指針和所對(duì)應(yīng)內(nèi)存的指向 “關(guān)系”。

在實(shí)際申請(qǐng)空間的時(shí)候,真實(shí)給你的空間是要大于你所需要的,但是你只能使用你要的大小,多出來(lái)的字節(jié),用來(lái)維護(hù)剛剛說(shuō)的那種關(guān)系,以及保存該次申請(qǐng)的 元數(shù)據(jù)(屬性數(shù)據(jù)):用戶(hù)申請(qǐng)的空間有多大,所以在free傳參的時(shí)候只用傳入你開(kāi)辟空間的起始地址就好了,根據(jù)屬性數(shù)據(jù)free函數(shù)就知道該釋放多少空間。

4.那我不想釋放那么多可以嗎?我按照以下代碼free。

free(p+4);

是不行的!堆空間必須整體申請(qǐng)整體釋放。

2.2 calloc函數(shù)

C語(yǔ)言還提供了一個(gè)函數(shù)calloc

void* calloc(size_t num, size_t size );

 calloc跟malloc使用基本一樣

只是有一點(diǎn)區(qū)別,malloc沒(méi)做初始化,隨機(jī)值,malloc效率更高一點(diǎn)。calloc做了初始化,效率更低一點(diǎn)。

2.3 relloc函數(shù)

C語(yǔ)言提供的這個(gè)函數(shù)讓動(dòng)態(tài)內(nèi)存管理更加的靈活,有時(shí)候發(fā)現(xiàn)申請(qǐng)的空間太小了,有時(shí)候覺(jué)得申請(qǐng)的空間太大了,合理調(diào)整內(nèi)存就有了relloc函數(shù)。

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

ptr是調(diào)整內(nèi)存的地址,size是調(diào)整后的大小,返回值是調(diào)整之后內(nèi)存的起始地址。

一般relloc在調(diào)整內(nèi)存是存在兩種情況

1.原有空間后面有足夠大的空間

直接向后擴(kuò)充就好了

2.原有空間后面沒(méi)有足夠大的空間

所以說(shuō)ptr也就是堆空間的起始地址有可能是變化的!

最后在分享一個(gè)題

void GetMemory(char* p)
{
	p = (char*)malloc(100);
}
int main ()
{
    char* str = NULL;
	GetMemory(str);
	strcpy(str, "hello world");
	printf(str);
}

 這個(gè)打印的是啥呢?

其實(shí)是有錯(cuò)誤的 str傳入函數(shù)發(fā)生臨時(shí)拷貝問(wèn)題此時(shí)p和str不是一個(gè)東西進(jìn)行動(dòng)態(tài)內(nèi)存開(kāi)辟讓我們的p指向開(kāi)辟的空間,調(diào)用函數(shù)開(kāi)辟棧幀,調(diào)用完畢釋放棧幀,p是一個(gè)臨時(shí)變量于那個(gè)空間已經(jīng)沒(méi)有指向關(guān)系了,而str依舊是NULL 

更改如下

void GetMemory(char** p)
{
	*p = (char*)malloc(100);
}
int main()
{
	char* str = NULL;
	GetMemory(&str);
	strcpy(str, "hello world");
	printf(str);
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!    

相關(guān)文章

  • C++?11新特性之右值引用使用案例與應(yīng)用場(chǎng)景

    C++?11新特性之右值引用使用案例與應(yīng)用場(chǎng)景

    右值引用和move語(yǔ)義是C++ 11中重要的特性之一,可以提高程序的效率和性能,右值引用是一種新的引用類(lèi)型,下面這篇文章主要給大家介紹了關(guān)于C++?11新特性之右值引用使用案例與應(yīng)用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • C/C++利用原生套接字抓取FTP數(shù)據(jù)包

    C/C++利用原生套接字抓取FTP數(shù)據(jù)包

    這篇文章主要為大家詳細(xì)介紹了如何基于原始套接字的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析工具,通過(guò)實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)流量,實(shí)現(xiàn)抓取流量包內(nèi)的FTP通信數(shù)據(jù),需要的小伙伴可以參考下
    2023-12-12
  • C 語(yǔ)言插入排序算法及實(shí)例代碼

    C 語(yǔ)言插入排序算法及實(shí)例代碼

    本文主要介紹C語(yǔ)言插入排序,這里給大家詳細(xì)介紹插入排序的思想并舉例說(shuō)明,還有實(shí)現(xiàn)代碼,有需要的朋友可以參考下
    2016-07-07
  • C語(yǔ)言printf詳細(xì)解析

    C語(yǔ)言printf詳細(xì)解析

    C中格式字符串printf()的一般形式為: %[標(biāo)志][輸出最小寬度][.精度][長(zhǎng)度]類(lèi)型, 其中方括號(hào)[]中的項(xiàng)為可選項(xiàng)。各項(xiàng)的意義介紹如下
    2013-09-09
  • 詳解Matlab如何繪制?;鶊D

    詳解Matlab如何繪制?;鶊D

    ?;鶊D是一種特定類(lèi)型的流程圖,圖中延伸的分支的寬度對(duì)應(yīng)數(shù)據(jù)流量的大小,通常應(yīng)用于能源、材料成分、金融等數(shù)據(jù)的可視化分析。本文將用Matlab繪制好看的?;鶊D,需要的可以參考一下
    2022-03-03
  • C++中std::construct()與std::destroy()的使用

    C++中std::construct()與std::destroy()的使用

    std::construct()和std::destroy()是C++ STL中的函數(shù)模板,用于在已分配的存儲(chǔ)區(qū)域中構(gòu)造或銷(xiāo)毀對(duì)象,本文主要介紹了C++中std::construct()與std::destroy()的使用,感興趣的可以了解一下
    2024-02-02
  • C語(yǔ)言實(shí)現(xiàn)掃雷OvO(完整代碼)

    C語(yǔ)言實(shí)現(xiàn)掃雷OvO(完整代碼)

    相信大家都玩過(guò)掃雷游戲,因?yàn)樗?jīng)典了,今天我們用C語(yǔ)言來(lái)模擬實(shí)現(xiàn)掃雷游戲,結(jié)合示例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2022-04-04
  • C語(yǔ)言實(shí)現(xiàn)三子棋的示例代碼

    C語(yǔ)言實(shí)現(xiàn)三子棋的示例代碼

    所謂三子棋,就是三行三列的棋盤(pán),玩家可以和電腦下棋,率先連成三個(gè)的獲勝。這篇文章主要為大家詳細(xì)介紹了如何通過(guò)C語(yǔ)言實(shí)現(xiàn)三子棋小游戲,感興趣的小伙伴可以嘗試一下
    2023-01-01
  • C語(yǔ)言初學(xué)者代碼中的常見(jiàn)錯(cuò)誤與問(wèn)題

    C語(yǔ)言初學(xué)者代碼中的常見(jiàn)錯(cuò)誤與問(wèn)題

    C語(yǔ)言初學(xué)者犯過(guò)的很多錯(cuò)誤都非常典型,在初學(xué)者中非常普遍,于是整理了一下,應(yīng)該對(duì)其他初學(xué)者有借鑒意義
    2013-11-11
  • C++函數(shù)重載的細(xì)節(jié)圖文詳解

    C++函數(shù)重載的細(xì)節(jié)圖文詳解

    函數(shù)重載即函數(shù)名相同,函數(shù)形參列表不同(函數(shù)特征標(biāo)不同)的一類(lèi)函數(shù)稱(chēng)為函數(shù)重載,下面這篇文章主要給大家介紹了關(guān)于C++函數(shù)重載的相關(guān)資料,需要的朋友可以參考下
    2022-12-12

最新評(píng)論