堆(heap)和栈(stack)
生活随笔
收集整理的這篇文章主要介紹了
堆(heap)和栈(stack)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
摘要
一般認(rèn)為在c中分為這幾個(gè)存儲(chǔ)區(qū)?
1棧 - 由編譯器自動(dòng)分配釋放? 2堆 - 一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收? 3全局區(qū)(靜態(tài)區(qū)),全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。? - 程序結(jié)束釋放? 4另外還有一個(gè)專門放常量的地方。 - 程序結(jié)束釋放? 在函數(shù)體中定義的變量通常是在棧上,用malloc, calloc, realloc等分配內(nèi)存的函數(shù)分配得到的就是在堆上。在所有函數(shù)體外定義的是全局量,加了static修飾符后不管在哪里都存放在全局區(qū)(靜態(tài)區(qū)),在所有函數(shù)體外定義的static變量表示在該文件中有效,不能extern到別的文件用,在函數(shù)體內(nèi)定義的static表示只在該函數(shù)體內(nèi)有效。另外,函數(shù)中的"adgfdf"這樣的字符串存放在常量區(qū)。? 比如:? 代碼:? int a = 0; ? //全局初始化區(qū)? char *p1; ? //全局未初始化區(qū)? main()? {? int b; //棧? char s[] = "abc"; ? //棧? char *p2; ? //棧? char *p3 = "123456"; ? //123456\0在常量區(qū),p3在棧上。? static int c = 0; //全局(靜態(tài))初始化區(qū)? p1 = (char *)malloc(10);? p2 = (char *)malloc(20);? //分配得來(lái)得10和20字節(jié)的區(qū)域就在堆區(qū)。? strcpy(p1, "123456");? //123456\0放在常量區(qū),編譯器可能會(huì)將它與p3所指向的"123456"優(yōu)化成一塊。? }? 小結(jié):? 堆和棧的區(qū)別可以用如下的比喻來(lái)看出:? 使用棧就象我們?nèi)ワ堭^里吃飯,只管點(diǎn)菜(發(fā)出申請(qǐng))、付錢、和吃(使用),吃飽了就走,不必理會(huì)切菜、洗菜等準(zhǔn)備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。? 使用堆就象是自己動(dòng)手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。?轉(zhuǎn)載于:https://www.cnblogs.com/hj-1996-123/p/9590531.html
總結(jié)
以上是生活随笔為你收集整理的堆(heap)和栈(stack)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安装asterisk 时遇到的报错情况,
- 下一篇: vue路由 routers的写法:req