堆棧什么東西阿?ZT
說實話,自己也只有個模糊的概念,這些是書上沒有的??科綍r的積累了。一般認為在c中分為這幾個存儲區 1棧 - 有編譯器自動分配釋放 2堆 - 一般由 程序員 分配釋放,若程序員不釋放,程序結束時可能由OS回收 3全局區(靜態區),全局變量和靜態變量的存儲是放
說實話,自己也只有個模糊的概念,這些是書上沒有的??科綍r的積累了。一般認為在c中分為這幾個存儲區
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在常量區,p3在棧上。
static int c =0; 全局(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得來得10和20字節的區域就在堆區。
strcpy(p1, "123456"); 123456放在常量區,編譯器可能會將它與p3所指向的"12345
6"優化成一塊。
}
還有就是函數調用時會在棧上有一系列的保留現場及傳遞參數的操作。
棧的空間大小有限定,vc的缺省是2M。棧不夠用的情況一般是程序中分配了大量數組和
遞歸函數層次太深。有一點必須知道,當一個函數調用完返回后它會釋放該函數中所有
的??臻g。棧是由編譯器自動管理的,不用你操心。
堆是動態分配內存的,并且你可以分配使用很大的內存。但是用不好會產生內存泄漏。
并且頻繁地malloc和free會產生內存碎片(有點類似磁盤碎片),因為c分配動態內存時
是尋找匹配的內存的。而用棧則不會產生碎片。
在棧上存取數據比通過指針在堆上存取數據快些。
一般大家說的堆棧和棧是一樣的,就是棧(stack),而說堆時才是堆heap.
棧是先入后出的,一般是由高地址向低地址生長。
原文轉自:http://www.kjueaiud.com
- 評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
-
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
|