C語言什么情況下需要用malloc來申請內(nèi)存,為什么要申請內(nèi)存?目的是什么?
C語言什么情況下需要用malloc來申請內(nèi)存,為什么要申請內(nèi)存?目的是什么?
malloc是用來動態(tài)分配內(nèi)存空間的。
為什么要使用動態(tài)內(nèi)存分配函數(shù)malloc,怎樣使用malloc函數(shù)?
動態(tài)去分配內(nèi)存是為了不浪費內(nèi)存!比如樓上說的一個班有多少學(xué)生?如果在開學(xué)的時候定*了中途轉(zhuǎn)入的怎么辦?如果你一次性定義1000這樣一個班再怎么都用不到那么多!但是如果你定義一個變量例如你說的那個宏!來接受你有多少個學(xué)生然后求出然后再開辟多少內(nèi)存,班上的學(xué)生減少和增加那個宏也會跟著減小和增大這樣就可以達(dá)到資源利用**的效果!當(dāng)然動態(tài)開辟的內(nèi)存要free(百科);釋放掉否則你一直占著這個內(nèi)存你的內(nèi)存會被耗盡。
C語言的malloc函數(shù)有什么用
1、這個涉及兩個存儲區(qū)域,堆和棧,用malloc申請的空間在堆上,chara[10]這個是在棧上。堆和棧最重要一個區(qū)別是,棧是系統(tǒng)管理的的,他負(fù)責(zé)回收和釋放,所以有個概念叫作用域,變量的作用域一結(jié)束,棧就回收變量的資源。
但是堆是程序員管理的,程序員不釋放,除非進(jìn)程結(jié)束,這個空間就一直在那,就有了一定靈活性。
2、當(dāng)無法知道內(nèi)存具**置的時候,想要綁定真正的內(nèi)存空間,就需要用到動態(tài)的分配內(nèi)存,即malloc函數(shù)。malloc函數(shù)原型:externvoid*malloc(unsignedintnum_bytes);頭文件:#include功能:分配長度為num_bytes字節(jié)的內(nèi)存塊返回值:如果分配成功則返回指向被分配內(nèi)存的指針(此存儲區(qū)中的初始值不確定),否則返回空指針null。當(dāng)內(nèi)存不再使用時,應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。函數(shù)返回的指針一定要適當(dāng)對齊,使其可以用于任何數(shù)據(jù)對象。
說明:關(guān)于該函數(shù)的原型,在以前malloc返回的是char型指針,新的ansic標(biāo)準(zhǔn)規(guī)定,該函數(shù)返回為void型指針,因此必要時要進(jìn)行類型轉(zhuǎn)換。
為什么STL內(nèi)存分配不使用new而使用malloc
函數(shù)體內(nèi)定義的局部變量是auto變量,在函數(shù)調(diào)用開始時分配空間,這些空間位于棧區(qū),函數(shù)調(diào)用結(jié)束后這些空間自動被釋放。使用malloc申請得到的空間是堆區(qū)空間,不由函數(shù)機(jī)制控制,可以由程序的任何部分調(diào)用,需要手動使用free釋放。
之所以需要在堆內(nèi)存中分配空間,是因為它可以跨函數(shù)引用,而且不需要(同樣可以跨函數(shù)引用的)如全局變量、全局靜態(tài)變量在進(jìn)程開始后始終占用靜態(tài)存儲區(qū)直至進(jìn)程退出,可以按需動態(tài)地分配和釋放。
(代價是通過指針等方式引用堆內(nèi)存比棧內(nèi)存中需要更多指令周期,效率要低;而且需要手動管理內(nèi)存分配和回收。) 另外,相比堆內(nèi)存,棧的內(nèi)存一般是相當(dāng)有限的,所以占用空間較大對象的管理一般都直接通過堆內(nèi)存。
C語言中什么時候需要malloc?
C語言中malloc是動態(tài)內(nèi)存分配函數(shù)。函數(shù)原型:void *malloc(unsigned int num_bytes);參數(shù):num_bytes 是無符號整型,用于表示分配的字節(jié)數(shù)。
返回值:如果分配成功則返回指向被分配內(nèi)存的指針(此存儲區(qū)中的初始值不確定),否則返回空指針NULL。
void* 表示未確定類型的指針,void *可以指向任何類型的數(shù)據(jù),更明確的說是指申請內(nèi)存空間時還不知道用戶是用這段空間來存儲什么類型的數(shù)據(jù)(比如是char還是int或者…)功能:分配長度為num_bytes字節(jié)的內(nèi)存塊注意:當(dāng)內(nèi)存不再使用時,應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。函數(shù)返回的指針一定要適當(dāng)對齊,使其可以用于任何數(shù)據(jù)對象。關(guān)于該函數(shù)的原型,在以前malloc返回的是char型指針,新的ANSIC標(biāo)準(zhǔn)規(guī)定,該函數(shù)返回為void型指針,因此必要時要進(jìn)行類型轉(zhuǎn)換。
什么情況下要用malloc動態(tài)分配內(nèi)存
當(dāng)程序開始運行時,不知道數(shù)組需要多大存放空間,只有當(dāng)某時刻以后才知道,那么需要用到動態(tài)分配malloc。程序里只有部分情況下或部分時間中要用到大數(shù)組,那么可以在需要時,malloc動態(tài)分配空間給它,使用完畢,可以釋放空間,以節(jié)省內(nèi)存。
當(dāng)程序里要用到內(nèi)存大小需要變化的大數(shù)組,需要用到realloc時,那么當(dāng)初次作動態(tài)分配空間時,可以用malloc,后來增大空間或縮小空間時,再用realloc。