1棧 - 有編譯器自動分配釋放
2堆 - 通常由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收
3全局區(靜態區),全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜
態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域。
- 程序結束釋放
4另外還有一個專門放常量的地方。 - 程序結束釋放
在函數體中定義的變量一般是在棧上,用malloc, calloc, realloc等分配內存的函數分
配獲得的就是在堆上。在全部函數體外定義的是全局量,加了static修飾符後無論在哪
裏都存放在全局區(靜態區),在全部函數體外定義的static變量表示在該文件中有效,
不能extern到別的文件用,在函數體內定義的static表示只在該函數體內有效。另外,
函數中的"adgfdf"這樣的字符串存放在常量區。
好比:
int a = 0; 全局初始化區
char *p1; 全局未初始化區
main()
{
int b; 棧
char s[] = "abc";棧
char *p2; 棧
char *p3 = "123456"; 123456\0在常量區,p3在棧上。
static int c =0; 全局(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得來得10和20字節的區域就在堆區。
strcpy(p1, "123456"); 123456\0放在常量區,編譯器可能會將它與p3所指向的"12345
6"優化成一塊。
}
還有就是函數調用時會在棧上有一系列的保留現場及傳遞參數的操做。
棧的空間大小有限定,vc的缺省是2M。棧不夠用的狀況通常是程序中分配了大量數組和
遞歸函數層次太深。有一點必須知道,當一個函數調用完返回後它會釋放該函數中全部
的棧空間。棧是由編譯器自動管理的,不用你操心。
堆是動態分配內存的,而且你能夠分配使用很大的內存。可是用很差會產生內存泄漏。
而且頻繁地malloc和free會產生內存碎片(有點相似磁盤碎片),由於c分配動態內存時
是尋找匹配的內存的。而用棧則不會產生碎片。
在棧上存取數據比經過指針在堆上存取數據快些。
通常你們說的堆棧和棧是同樣的,就是棧(stack),而說堆時纔是堆heap.
棧是先入後出的,通常是由高地址向低地址生長。 程序員