當前位置:
首頁 >
堆(heap)和栈(stack)
發布時間:2025/3/14
16
豆豆
生活随笔
收集整理的這篇文章主要介紹了
堆(heap)和栈(stack)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
摘要
一般認為在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\0在常量區,p3在棧上。? static int c = 0; //全局(靜態)初始化區? p1 = (char *)malloc(10);? p2 = (char *)malloc(20);? //分配得來得10和20字節的區域就在堆區。? strcpy(p1, "123456");? //123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一塊。? }? 小結:? 堆和棧的區別可以用如下的比喻來看出:? 使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。? 使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。?轉載于:https://www.cnblogs.com/hj-1996-123/p/9590531.html
總結
以上是生活随笔為你收集整理的堆(heap)和栈(stack)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装asterisk 时遇到的报错情况,
- 下一篇: vue路由 routers的写法:req