1、記憶體區域的劃分标準:
代碼段 存儲代碼
資料段 靜态/全局資料、常量(const)
堆區(heap) 動态記憶體配置設定(更靈活的設定容器大小存儲資料)
棧區(stack) 局部變量、函數參數
2、記憶體配置設定方式的原理:靜态配置設定和動态配置設定
靜态配置設定:編譯器在處理程式源代碼時配置設定(變量)
動态配置設定:程式執行時按動态要求來配置設定(由程式員來決定,用完得人為釋放)
比較:靜态的程式執行前配置設定,效率高,靈活差,對象是有名字的變量,記憶體配置設定和釋放由編譯器完成;動态對象沒有名字的變量,通過指針間接地對它進行操作。
3、了解野指針的概念:
概念:野指針不是空(NULL)指針,二是指向不屬于自己的記憶體指針。
三種形式:
(1)指針變量沒有被初始化。
(2)指針p被free或者delete之後,沒有将其置NULL,但是p仍然指向這塊已經不屬于自己的記憶體。
(3)通過函數傳回局部變量的位址。局部變量存放在stack棧中,函數一被執行完,在這個棧中的資料就會被釋放,此時傳回的指針就沒有了指向,也就是函數中的那一塊記憶體已經不屬于傳回的這個指針了。
4、記憶體洩露的概念:
記憶體被配置設定後被系統記錄,但是用完了,最後沒有被釋放,記錄也就沒有被删除此時記憶體一直被占用,即為記憶體洩露。類似于圖書館,好借好還。
5、了解malloc函數原型的含義:
#include<stdlib.h>
malloc 函數原型:
void * malloc(unsigned int size);
通用類型指針,真正使用時,需要強制轉換為要使用的類型
說明:(1)、size這個參數的含義是配置設定的記憶體的大小(以位元組為機關)
(2)、傳回值:失敗,則傳回值為NULL(空指針)。成功,則傳回是一個 指向空類型(void)的指針,即所配置設定記憶體塊的首位址。
記住:先對傳回值做判斷?如果為空,配置設定記憶體失敗。反之,申請成功。
(1) 用malloc申請一塊隻儲存一個整型類型的記憶體
int *p = (int*)malloc(sizeof(int)
(2) 用malloc申請一塊能夠儲存25個整型類型的記憶體
int *p = (int *)malloc(sizeof(int)*25)
對動态空間的通路方式
對單一記憶體的通路
*p = 100;
對動态數組的通路
p[1];*(p+1);(p+1)
數組存儲資料時:
*(p+i)//循環存儲資料過程中,p所指向的一塊記憶體首位址一直沒有變過,變化的隻是資料在這一塊記憶體中存放的位置。測試過
*p++;//循環存儲資料中,p所指向的記憶體首位址一直在變化,其實,就是一塊記憶體隻是存放了一個資料,p就移動指向了另一塊空間首位址,接着存下一個資料。測試過
6、釋放記憶體的函數free的含義:
函數原型:free (void *block)//釋放的必須是malloc傳回的位址
說明:動态記憶體的申請和釋放必須配對
7、注意事項:
(1)如果函數參數是一個指針,不要指望指針自己去申請動态記憶體。也就說指針必須指向一個有效的記憶體區域。
(2)指針消亡了,p=NULL并不代表它所指向的記憶體會被自動釋放;記憶體被釋放了,free(p)并不代表指針會消亡或者成了空指針。必須兩者結合。
(3)malloc配置設定記憶體後,程式結束前必須使用free()将已配置設定的記憶體空間釋放。malloc和free必須是一對一的關系,不能一對多即過度釋放。
8、知識拓展:
(1)使用calloc函數配置設定動态記憶體
函數原型:void *calloc(unsigned n,unsigned size );
作用是:在記憶體的動态存儲區中配置設定n個長度為size的連續空間,這個空間一般比較大,足以儲存一個數組。
意義:用calloc函數可以為一維數組開辟動态的存儲空間,n為數組元素個數,每個元素長度為size。這就是動态數組。函數傳回指向所配置設定域的起始位置的指針;如果配置設定不成功,傳回NULL。
例如:
p = calloc(50,4);//開辟50*4個位元組的臨時配置設定域,把起始位址賦給指針變量p
(2)使用realloc函數配置設定動态記憶體
函數原型:void* realloc(void *p,unsigned int size);
作用:如果已經通過malloc函數或将calloc函數獲得了動态空間,想改變其大小,可以用realloc函數重新配置設定。
意義:用realloc函數将p所指向的動态空間的大小改變為size。p的指向不變,如果配置設定不成功,傳回NULL。
程式猿神奇的手,每時每刻,這雙手都在改變着世界的互動方式!
本文轉自當天真遇到現實部落格園部落格,原文連結:http://www.cnblogs.com/XYQ-208910/p/4726365.html,如需轉載請自行聯系原作者