亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言之棧和堆(Stack && Heap)的優缺點及其使用區別

2020-01-26 15:01:32
字體:
來源:轉載
供稿:網友

一、前言

     直到現在,我們已經知道了我們如何聲明常量類型,例如int,double,等等,還有復雜的例如數組和結構體等。我們聲明他們有各種語言的語法,例如Matlab,Python等等。在C語言中,把這些變量放在棧內存中。

二、基礎

     1、棧

          什么是棧,它是你的電腦內存的一個特別區域,它用來存儲被每一個function(包括mian()方法)創建的臨時變量。棧是FILO,就是先進后出原則的結構體,它密切的被CPU管理和充分利用。每次function聲明一個新的變量,它就會被“推”到棧中。然后每次一個function退出時,所有關于這個函數中定義的變量都會被釋放(換句話說就是刪除)。一旦棧中的變量釋放,這塊區域就會變成可用的,提供給其他棧中的變量。

     用棧存儲變量的好處是,內存是被你管理的。你不用手動的創建內存,不用當你不在需要它的時候手動釋放內存。另外,由于CPU組織棧內存很高效。讀出和寫入棧變量是很快的。

     理解棧的關鍵是理解概念,當一個function退出時,所有它的變量都會從棧中彈出,以后都會永遠消失。因此棧中的變量本質是局部的。這和我們原來理解為變量作用域或者本地或者全局變量是相關的。在C中,一個公共的bug 是從你程序中的一個function外嘗試訪問一個在棧中的這個function的變量(在該function已經退出后)。
    

關于棧的另一個特點我們應該記住,就是存儲再棧中的變量的大小有限制。而堆上創建變量不用考慮。
    

總結棧:
      a、棧的生長和伸縮就是函數壓入或者推出局部變量。
      b、我們不用自己去管理內存,變量創建和釋放都是自動的。
      c、棧中的變量只有在函數創建運行時存在。
    

2、 堆
         

堆也是我們的計算機內存中的一個區域,但是他不是自動管理的。而且也不是被CPU密切的管理著。它是一片更加自由的內存區域(很大)。要想在堆上創建內存,我們必須使用malloc() 或者calloc(),他們都是C語言編譯的。一旦你在堆上分配內存,當你不在需要的時候你必須用free()去銷毀。如果你不銷毀或者銷毀失敗,你的程序就會有內存泄露。換句話說就是堆內存會一直在,其他進程無法使用。我們將會再調試部分看到,那里有一個叫做Valgrind的東西,它可以幫助你發現內存泄露。
    

不像棧,堆沒有變量大小的限制(除了你電腦的物理限制條件外)。堆內存讀出和寫入都比較慢,因為它必須使用指針圖訪問堆內存。我們將會下面講解指針。
   

3、棧和堆的優缺點
    

棧:
          a、快速訪問。
          b、沒有必要明確的創建分類變量,因為它是自動管理的。
          c、空間被CPU高效地管理著,內存不會變成碎片。
          d、只有局部變量
          e、受限于棧大小(取決于操作系統)
          f、變量不能調整大小。
        堆:
          a、變量可以被全局訪問
          b、沒有內存大小限制
          c、(相對)訪問比較慢
          d、沒有高效地使用空間,隨著塊內存的創建和銷毀,內存可能會變成碎片。
          e、你必須管理內存(變量的創建和銷毀你必須要負責)
          f、變量大小可以用realloc( )調整
例如:    
          下面是一個在棧上創建變量的短程序。和我們看到的其他程序類似

 #include <stdio.h> double multiplyByTwo (double input) { double twice = input * 2.0; return twice; } int main(int argc, const char * argv[]) { int age = 30; double salary = 12345.67; double myList[3] = {1.2,2.3,3.4}; printf("double your salary is %.3f/n",multiplyByTwo(salary)); return 0; }


  
 運行結果如下: double your salary is 24691.340
    

在第7,8和9行,我們聲明了三個變量:一個int變量、一個double變量和一個包含三個包含double的數組。這三個變量在main()函數創建,被壓入棧中。當main()函數退出(程序退出),這些變量就會出棧。同樣地,在multiplyByTwo函數中,第二個double變量,也會在multiplyByTwo()函數創建的時候壓入棧中。一旦函數退出,第二個變量就會出棧,永遠地消失。
    

備注:有一種方法可以告訴C保持一個棧變量。即使它的創建函數退出。那就是用static關鍵字當聲明變量的時候。一個變量用static關鍵之聲明,因此就會變成一個類似與全局變量的東西。但是它僅僅在創建它的函數里面可見。這是一個奇怪的東西,除非你在一個非常特殊的情況下需要。
    

下面是另一個版本的創建變量在堆上而不是在棧上:

#include <stdio.h>#include <stdlib.h> double *multiplyByTwo (double *input) { double *twice = malloc(sizeof(double)); *twice = *input *2.0; return twice;}int main(int argc, const char * argv[]) { int *age = malloc(sizeof(int)); *age = 30; double *salary = malloc(sizeof(double)); *salary = 12345.67; double *myList = malloc(3 * sizeof(double)); myList[0] = 1.2; myList[1] = 3.4; myList[2] = 4.5; double *twiceSalary = multiplyByTwo(salary);  printf("double your salary is %.3f/n",*twiceSalary);  free(age); free(salary); free(myList); free(twiceSalary);  return 0;}

  
正如你所看到的,我們用malloc()去分配堆內存,用free()去釋放它。這樣不是很大的處理,但是很笨重。還有一件要注意的事情是:這樣會由很多*號。這些是指針。malloc()(calloc()和free())函數處理的是指針而不是真正的數值。我們將會在下邊討論指針。指針在C棧是一個特殊的數據類型,它用來存儲內存的地址而不是存儲實際的values.因此在

*twice = *input *2.0;


  
這行,twice變量不是一個double,而是一個指向double的指針,是double被存儲再內存中的地址。

4、什么時候使用堆
    

       我們應該什么時候使用堆和棧呢?如果我們需要分配一大塊內存(例如一個很大的數組或者一個很大的結構體),而且我們需要保持這個變量很長時間(例如全局變量)。我們應該分配堆內存。如果你處理的很小的變量,而且只要再函數使用的時候存活,那么你應該使用棧,它比較方便而且快捷。如果你需要類似與數組或者結構體的變量,而且能夠動態改變大?。ɡ缫粋€數組可以根據需要添加數據或者刪除數據),那么你可以用malloc(),realloc()給他們分配堆內存,用free()手動的管理內存。當我們討論完指針,我們將會討論動態分配數據結構體。

通過以上對棧和堆的介紹,希望對大家了解和區分棧和堆有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
伦伦影院午夜日韩欧美限制| 久久精品91久久久久久再现| 日韩亚洲精品视频| 久久久精品一区| 91九色蝌蚪国产| 亚洲一区亚洲二区亚洲三区| 精品亚洲永久免费精品| 欧美在线国产精品| 久久亚洲一区二区三区四区五区高| 精品美女永久免费视频| 国产在线视频2019最新视频| 精品久久在线播放| 亚洲男人的天堂在线播放| yellow中文字幕久久| 中文字幕在线看视频国产欧美在线看完整| 国产精品香蕉国产| 最近2019中文免费高清视频观看www99| 97婷婷大伊香蕉精品视频| 久久免费国产视频| 久久天天躁狠狠躁老女人| 91久久精品国产| 国产精品视频公开费视频| 秋霞av国产精品一区| 国产精品网红福利| 亚洲国产日韩欧美在线99| 综合激情国产一区| 欧美成人一区二区三区电影| 亚洲3p在线观看| 亚洲欧美日韩中文视频| 亚洲香蕉av在线一区二区三区| 中文字幕一区日韩电影| 欧美亚洲国产日韩2020| 久久久久久18| 欧美高清在线视频观看不卡| 欧美日韩黄色大片| 久久91精品国产91久久跳| 日韩电视剧免费观看网站| 成人av在线网址| 久久国产精品亚洲| 国产精品久久久久久久久| 日韩美女av在线| 在线日韩日本国产亚洲| 国产成人精品久久亚洲高清不卡| 日韩av免费一区| 国产女精品视频网站免费| 全球成人中文在线| 久久久久国产精品www| 中文字幕欧美专区| 欧美精品在线免费播放| 九九精品在线观看| 亚洲性猛交xxxxwww| 亚洲人线精品午夜| 国产欧美久久久久久| 5252色成人免费视频| 亚洲美女在线视频| 91久久国产精品| 91综合免费在线| 久久天天躁狠狠躁夜夜躁2014| 国产精品免费在线免费| 亚洲国产欧美一区二区丝袜黑人| 成人免费淫片aa视频免费| 福利视频一区二区| 国产精品美女免费| 麻豆精品精华液| 欧美亚洲另类制服自拍| 91在线播放国产| 欧美亚洲午夜视频在线观看| 97视频免费在线观看| 日韩高清电影免费观看完整| 国产一区二区久久精品| 欧美中文在线观看| 久久久久久久久久av| 国产一区二区丝袜高跟鞋图片| www.日韩不卡电影av| 粉嫩老牛aⅴ一区二区三区| 米奇精品一区二区三区在线观看| 欧美日韩成人网| 91视频免费网站| 中文字幕亚洲欧美日韩2019| 欧美日韩福利电影| 国产成人拍精品视频午夜网站| 日韩在线观看视频免费| 欧美第一黄网免费网站| 欧美电影免费观看电视剧大全| 精品国产欧美成人夜夜嗨| 国产精品久久久久久久久久尿| 亚洲国产精品成人一区二区| 国产亚洲欧美一区| 国产精品日韩欧美大师| 高清欧美性猛交xxxx| 97超碰国产精品女人人人爽| 欧美日韩国产一区中文午夜| 成人欧美在线观看| 国产香蕉精品视频一区二区三区| 日韩在线免费高清视频| 欧美乱妇高清无乱码| 国产丝袜一区二区| 久久99国产综合精品女同| 日韩成人在线播放| 亚洲精品资源在线| 中文日韩在线观看| 久久精品99久久久久久久久| 久久久在线免费观看| 亚洲最大av网站| 自拍亚洲一区欧美另类| 亚洲国产欧美在线成人app| 日韩大陆毛片av| 久久在线观看视频| 国产成人免费av| 国产成人亚洲综合91精品| 日韩精品欧美激情| 久久久久亚洲精品国产| 中文欧美在线视频| 欧美精品video| 国产精品久久久久免费a∨| 最近2019中文字幕mv免费看| 色噜噜亚洲精品中文字幕| 91中文在线观看| 日韩成人在线视频观看| 国产精品黄色影片导航在线观看| 日韩美女在线观看一区| 成人av电影天堂| 国产精品人成电影| 91黑丝在线观看| 色av中文字幕一区| 九九久久综合网站| 另类专区欧美制服同性| 亚洲护士老师的毛茸茸最新章节| 亚洲国产日韩精品在线| 亚洲乱码av中文一区二区| 成人在线国产精品| 久久久久久成人| 国产欧美精品在线| 青青草一区二区| 国产精品人成电影在线观看| 色悠久久久久综合先锋影音下载| 亚洲欧洲在线视频| 日本久久亚洲电影| 精品高清美女精品国产区| 亚洲第一区中文99精品| 亚洲人永久免费| 91av视频在线播放| 国产不卡av在线免费观看| 国产精品免费观看在线| 国产精品色婷婷视频| 日韩激情片免费| 欧美成人免费小视频| 成人激情av在线| 亚洲欧美成人一区二区在线电影| 国产精品com| 久久成人精品视频| 久久久久久久国产精品| 色多多国产成人永久免费网站| 欧美电影《睫毛膏》| 欧美性生交大片免网| 亚洲人成电影在线播放| 亚洲性猛交xxxxwww| 精品欧美aⅴ在线网站| 日韩三级影视基地| 欧美日韩免费观看中文| 亚洲国产精品成人va在线观看| 欧美成人精品影院| 亚洲精品一区二三区不卡| 国产精品一区二区在线|