1削彬、申請內(nèi)存的區(qū)域
棧區(qū)全庸、堆區(qū)、全局區(qū)融痛、字符常量區(qū)壶笼、代碼區(qū)
定義的變量數(shù)組等都是在棧區(qū)申請,棧區(qū)的內(nèi)存由系統(tǒng)申請和釋放雁刷,在變量生命周期結(jié)束時釋放覆劈,默認(rèn)大小是1MB。
堆區(qū)由我們隨時申請沛励,也由我們隨時釋放责语。
2、malloc函數(shù)
功能:從堆區(qū)申請指定大小的連續(xù)的一段空間目派。如int *p=(int *)malloc(4)申請了一個4字節(jié)的int型的空間坤候,返回結(jié)果是該片內(nèi)存的首地址,這里的(int *)是強(qiáng)制類型轉(zhuǎn)換企蹭。申請的空間大小也可以是表達(dá)式或者sizeof()*n等白筹。
頭文件是malloc.h和stdlib.h兩個,32位系統(tǒng)最多申請4G练对,64位最大支持16TB遍蟋。
三種情況:申請空間合理當(dāng)該空間釋放時可能會產(chǎn)生內(nèi)存碎片(釋放的內(nèi)存無法滿足新的程序所需的內(nèi)存大小)螟凭;申請空間為0(malloc(0))會返回一個可用空間首地址,但是地址長度為0它呀;申請空間過大時會發(fā)生溢出警告螺男。
注意點:①注意邊界
②一個指針指向了一塊堆區(qū)空間,不能將該指針指向另外一個地址空間纵穿,否則會導(dǎo)致內(nèi)存丟失或者內(nèi)存泄漏下隧,沒法對之前指向的地址進(jìn)行釋放等操作。當(dāng)一個新的指針指向原來的地址谓媒,那么原來的指針可以釋放淆院。
3、size_t函數(shù)
size_t=unsigned int(32位編譯環(huán)境是4字節(jié)int句惯,64位是8位longint)
4土辩、memset函數(shù)
memset函數(shù)是內(nèi)存賦值,按照字節(jié)依次賦值抢野,得包涵memory.h頭文件拷淘。
int *p=malloc(40);申請一個40字節(jié)的int型地址指孤,也就是包含10個int型的參數(shù)启涯。
memset(p贬堵,1,40)结洼;使用memset進(jìn)行賦值黎做。
每個字節(jié)有8位,即每一個字節(jié)都被賦值為0000_0001松忍,那么將4個字節(jié)拼為一個int型引几,這里的值顯然不是1。
因此挽铁,memset函數(shù)只能用于將元素全部賦0伟桅。
5、free函數(shù)
功能:釋放申請的內(nèi)存
寫法:free(p)叽掘,無返回值楣铁,p是申請空間的首地址。
另外更扁,如果指針指向的空間訪問受限盖腕,那么稱之為野指針,不能直接使用浓镜。free后的p就是野指針溃列,之后可以將p=NULL或p=0可以解決,另外的沒有初始化的指針也是野指針膛薛。
要點:①不能釋放棧區(qū)空間听隐;
②不能重復(fù)釋放同一個空間;
③一定要釋放頭指針哄啄。
6雅任、malloc的空間在程序結(jié)束時,系統(tǒng)會自動釋放malloc的內(nèi)存咨跌,那為什么還要free()沪么?
在使用軟件的過程中,程序沒有停止那么malloc申請的空間就不會被釋放锌半,那么如果不手工釋放的話禽车,軟件運(yùn)行過程中會在很短時間內(nèi)就內(nèi)存溢出(總不能3分鐘一關(guān)或者重啟吧)。
7刊殉、malloc申請數(shù)組空間
malloc返回申請的空間的首地址殉摔,可以用強(qiáng)制轉(zhuǎn)換該地址的類型
int *p=(int *)malloc(sizeof(int)*5);//在堆區(qū)申請4*5=20個字節(jié)的連續(xù)地址空間
p+1冗澈;//訪問的是第五個字節(jié)的地址钦勘,也就是第二個int 型的元素的首地址
malloc申請的數(shù)組也被稱為動態(tài)數(shù)組,可以在使用時動態(tài)申請不定長度的數(shù)組空間亚亲,而申請后的數(shù)組的長度是不可變得彻采。
malloc申請的地址空間不能進(jìn)行初始化腐缤,但是可以賦值,賦值可以使用循環(huán)語句或者memset賦值為0
8肛响、malloc與一維二維數(shù)組指針
一維數(shù)組:int (*p)[5]=(int (*)[5])malloc(sizeof(int)*5); ? ??//小括號不能丟岭粤,丟了就是指針數(shù)組
int a[5];
int (*p1)[5]=&a; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //這里的p1和p等價
(*p1)[n]來訪問數(shù)組元素。
二維數(shù)組:int(*p)[2][3]=(int (*)[2][3])malloc(sizeof(int)*2*3);
int(*p1)[2][3]=&a; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //同理這里的p1和p等價
(*p1)[i][j]來訪問數(shù)組元素特笋。