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

C語言動態(tài)開辟內(nèi)存詳解

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

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

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

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

2.對于不定長數(shù)據(jù)保存問題,動態(tài)開辟空間可以解決。

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

2.1 malloc和free函數(shù)

C語言提供了一個動態(tài)開辟內(nèi)存的函數(shù)。

void* malloc (size_t size);

C語言還提供了一個函數(shù)free是對動態(tài)開辟內(nèi)存釋放和回收的。

void free (void* ptr);

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

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

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

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

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

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

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

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

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

free(p+4);

是不行的!堆空間必須整體申請整體釋放。

2.2 calloc函數(shù)

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

void* calloc(size_t num, size_t size );

 calloc跟malloc使用基本一樣

只是有一點區(qū)別,malloc沒做初始化,隨機值,malloc效率更高一點。calloc做了初始化,效率更低一點。

2.3 relloc函數(shù)

C語言提供的這個函數(shù)讓動態(tài)內(nèi)存管理更加的靈活,有時候發(fā)現(xiàn)申請的空間太小了,有時候覺得申請的空間太大了,合理調(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.原有空間后面有足夠大的空間

直接向后擴充就好了

2.原有空間后面沒有足夠大的空間

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

最后在分享一個題

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

 這個打印的是啥呢?

其實是有錯誤的 str傳入函數(shù)發(fā)生臨時拷貝問題此時p和str不是一個東西進(jìn)行動態(tài)內(nèi)存開辟讓我們的p指向開辟的空間,調(diào)用函數(shù)開辟棧幀,調(diào)用完畢釋放棧幀,p是一個臨時變量于那個空間已經(jīng)沒有指向關(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é)

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

相關(guān)文章

  • C/CPP運算優(yōu)先級的坑及解決

    C/CPP運算優(yōu)先級的坑及解決

    這篇文章主要介紹了C/CPP運算優(yōu)先級的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 基于OpenCV和C++ 實現(xiàn)圖片旋轉(zhuǎn)

    基于OpenCV和C++ 實現(xiàn)圖片旋轉(zhuǎn)

    這篇文章主要介紹了基于OpenCV和C++ 實現(xiàn)圖片旋轉(zhuǎn),幫助大家更好的利用c++處理圖片,感興趣的朋友可以了解下
    2020-12-12
  • 詳解C語言fscanf函數(shù)讀取文件教程及源碼

    詳解C語言fscanf函數(shù)讀取文件教程及源碼

    這篇文章主要為大家介紹了詳解C語言算法fscanf讀取文件示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • 剖析C++編程中friend關(guān)鍵字所修飾的友元函數(shù)和友元類

    剖析C++編程中friend關(guān)鍵字所修飾的友元函數(shù)和友元類

    這篇文章主要介紹了剖析C++編程中friend關(guān)鍵字所修飾的友元函數(shù)和友元類,友元了以后在外部就可以訪問到正常情況下無法訪問到的私有屬性和方法,需要的朋友可以參考下
    2016-01-01
  • C/C++中使用列表框組件Qt?ListWidget

    C/C++中使用列表框組件Qt?ListWidget

    本文詳細(xì)講解了C/C++中使用列表框組件Qt?ListWidget的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • C++ Boost Thread線程使用示例詳解

    C++ Boost Thread線程使用示例詳解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C++直接初始化與復(fù)制初始化的區(qū)別深入解析

    C++直接初始化與復(fù)制初始化的區(qū)別深入解析

    這篇文章主要介紹了C++直接初始化與復(fù)制初始化的區(qū)別深入解析,是很多C++初學(xué)者需要深入了解的重要概念,需要的朋友可以參考下
    2014-09-09
  • C語言數(shù)據(jù)結(jié)構(gòu)不掛科指南之線性表詳解

    C語言數(shù)據(jù)結(jié)構(gòu)不掛科指南之線性表詳解

    線性表是由?n(n≥0)個數(shù)據(jù)元素組成的有窮序列,這篇文章主要來和大家來了C語言數(shù)據(jù)結(jié)構(gòu)中的線性表,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-09-09
  • C++ operator關(guān)鍵字(重載操作符)的用法詳解

    C++ operator關(guān)鍵字(重載操作符)的用法詳解

    下面小編就為大家?guī)硪黄狢++ operator關(guān)鍵字(重載操作符)的用法詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C語言如何計算字符串長度

    C語言如何計算字符串長度

    這篇文章主要介紹了C語言如何計算字符串長度問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論

五台县| 玛纳斯县| 丹寨县| 淮阳县| 高清| 朝阳市| 绥宁县| 南郑县| 罗定市| 微博| 合作市| 新余市| 徐汇区| 桓台县| 永嘉县| 特克斯县| 杨浦区| 剑河县| 上林县| 辰溪县| 日土县| 长岭县| 修武县| 普兰店市| 兴义市| 临猗县| 镇雄县| 瑞丽市| 肃宁县| 微山县| 星座| 永修县| 雷山县| 花莲市| 韶关市| 城口县| 东阿县| SHOW| 喀什市| 图片| 周至县|