中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
malloc、calloc、realloc的區(qū)別

(1)C語言跟內(nèi)存分配方式

<1>從靜態(tài)存儲(chǔ)區(qū)域分配.
       內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在.例如全局變量、static變量.
<2>在棧上創(chuàng)建
       在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放.棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限.

<3>從堆上分配,亦稱動(dòng)態(tài)內(nèi)存分配.
       程序在運(yùn)行的時(shí)候用malloc或new申請(qǐng)任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時(shí)用free或delete釋放內(nèi)存.動(dòng)態(tài)內(nèi)存的生存期由用戶決定,使用非常靈活,但問題也最多.


(2)C語言跟內(nèi)存申請(qǐng)相關(guān)的函數(shù)主要有 alloca、calloc、malloc、free、realloc等.
    <1>alloca是向棧申請(qǐng)內(nèi)存,因此無需釋放.
    <2>malloc分配的內(nèi)存是位于堆中的,并且沒有初始化內(nèi)存的內(nèi)容,因此基本上malloc之后,調(diào)用函數(shù)memset來初始化這部分的內(nèi)存空間.
    <3>calloc則將初始化這部分的內(nèi)存,設(shè)置為0.
    <4>realloc則對(duì)malloc申請(qǐng)的內(nèi)存進(jìn)行大小的調(diào)整.
    <5>申請(qǐng)的內(nèi)存最終需要通過函數(shù)free來釋放.
    當(dāng)程序運(yùn)行過程中malloc了,但是沒有free的話,會(huì)造成內(nèi)存泄漏.一部分的內(nèi)存沒有被使用,但是由于沒有free,因此系統(tǒng)認(rèn)為這部分內(nèi)存還在使用,造成不斷的向系統(tǒng)申請(qǐng)內(nèi)存,使得系統(tǒng)可用內(nèi)存不斷減少.但是內(nèi)存泄漏僅僅指程序在運(yùn)行時(shí),程序退出時(shí),OS將回收所有的資源.因此,適當(dāng)?shù)闹仄鹨幌鲁绦?有時(shí)候還是有點(diǎn)作用.
attention
    三個(gè)函數(shù)的申明分別是:
        void* malloc(unsigned size);
        void* realloc(void* ptr, unsigned newsize); 
        void* calloc(size_t numElements, size_t sizeOfElement);
    都在stdlib.h函數(shù)庫內(nèi),它們的返回值都是請(qǐng)求系統(tǒng)分配的地址,如果請(qǐng)求失敗就返回NULL.
    (1)函數(shù)malloc()
        在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一塊長度為size字節(jié)的連續(xù)區(qū)域,參數(shù)size為需要內(nèi)存空間的長度,返回該區(qū)域的首地址.
    (2)函數(shù)calloc()
        與malloc相似,參數(shù)sizeOfElement為申請(qǐng)地址的單位元素長度,numElements為元素個(gè)數(shù),即在內(nèi)存中申請(qǐng)numElements*sizeOfElement字節(jié)大小的連續(xù)地址空間.
    (3)函數(shù)realloc()
        給一個(gè)已經(jīng)分配了地址的指針重新分配空間,參數(shù)ptr為原有的空間地址,newsize是重新申請(qǐng)的地址長度.
    區(qū)別:
    (1)函數(shù)malloc不能初始化所分配的內(nèi)存空間,而函數(shù)calloc能.如果由malloc()函數(shù)分配的內(nèi)存空間原來沒有被使用過,則其中的每一位可能都是0;反之, 如果這部分內(nèi)存曾經(jīng)被分配過,則其中可能遺留有各種各樣的數(shù)據(jù).也就是說,使用malloc()函數(shù)的程序開始時(shí)(內(nèi)存空間還沒有被重新分配)能正常進(jìn)行,但經(jīng)過一段時(shí)間(內(nèi)存空間還已經(jīng)被重新分配)可能會(huì)出現(xiàn)問題.
    (2)函數(shù)calloc() 會(huì)將所分配的內(nèi)存空間中的每一位都初始化為零,也就是說,如果你是為字符類型或整數(shù)類型的元素分配內(nèi)存,那么這些元素將保證會(huì)被初始化為0;如果你是為指針類型的元素分配內(nèi)存,那么這些元素通常會(huì)被初始化為空指針;如果你為實(shí)型數(shù)據(jù)分配內(nèi)存,則這些元素會(huì)被初始化為浮點(diǎn)型的零.
    (3)函數(shù)malloc向系統(tǒng)申請(qǐng)分配指定size個(gè)字節(jié)的內(nèi)存空間.返回類型是 void*類型.void*表示未確定類型的指針.C,C++規(guī)定,void* 類型可以強(qiáng)制轉(zhuǎn)換為任何其它類型的指針.
    (4)realloc可以對(duì)給定的指針?biāo)傅目臻g進(jìn)行擴(kuò)大或者縮小,無論是擴(kuò)張或是縮小,原有內(nèi)存的中內(nèi)容將保持不變.當(dāng)然,對(duì)于縮小,則被縮小的那一部分的內(nèi)容會(huì)丟失.realloc并不保證調(diào)整后的內(nèi)存空間和原來的內(nèi)存空間保持同一內(nèi)存地址.相反,realloc返回的指針很可能指向一個(gè)新的地址.
    (5)realloc是從堆上分配內(nèi)存的.當(dāng)擴(kuò)大一塊內(nèi)存空間時(shí),realloc()試圖直接從堆上現(xiàn)存的數(shù)據(jù)后面的那些字節(jié)中獲得附加的字節(jié),如果能夠滿足,自然天下太平;如果數(shù)據(jù)后面的字節(jié)不夠,問題就出來了,那么就使用堆上第一個(gè)有足夠大小的自由塊,現(xiàn)存的數(shù)據(jù)然后就被拷貝至新的位置,而老塊則放回到堆上.這句話傳遞的一個(gè)重要的信息就是數(shù)據(jù)可能被移動(dòng).

[c-sharp] view plaincopy
  1.             #include <stdio.h>  
  2. #include <malloc.h>  
  3.   
  4. int main(int argc, char* argv[])   
  5. {   
  6.     char *p,*q;  
  7.     p = (char *)malloc(10);  
  8.     q = p;  
  9.     p = (char *)realloc(p,10);  
  10.     printf("p=0x%x/n",p);  
  11.     printf("q=0x%x/n",q);  
  12.       
  13.     return 0;   
  14. }   
  15.    輸出結(jié)果:realloc后,內(nèi)存地址不變  
  16.             p=0x431a70  
  17.             q=0x431a70  
  18.   
  19.    例2:  
  20.             #include <stdio.h>  
  21. #include <malloc.h>  
  22.   
  23. int main(int argc, char* argv[])   
  24. {   
  25.     char *p,*q;  
  26.     p = (char *)malloc(10);  
  27.     q = p;  
  28.     p = (char *)realloc(p,1000);  
  29.     printf("p=0x%x/n",p);  
  30.     printf("q=0x%x/n",q);  
  31.       
  32.     return 0;   
  33. }   
  34.    輸出結(jié)果:realloc后,內(nèi)存地址發(fā)生了變化  
  35.             p=0x351c0  
  36.             q=0x431a70  

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C語言的那些小秘密之內(nèi)存分配
動(dòng)態(tài)內(nèi)存分配函數(shù)解析
c與c++分別是怎樣動(dòng)態(tài)分配和釋放內(nèi)存的,有什么區(qū)別?(轉(zhuǎn)) demo大全
動(dòng)態(tài)內(nèi)存分配
3.4 動(dòng)態(tài)內(nèi)存分配 (Dynamic memory)
詳解動(dòng)態(tài)內(nèi)存分配函數(shù)malloc、calloc、realloc、free的區(qū)別
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服