程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C/C++內存(續)

C/C++內存(續)

編輯:關於C語言

堆和棧的區別:

1.申請方式

棧:由系統自動分配的,例如,聲明在一個函數中的一個局部變量int b,系統自動在棧中為b開辟空間。

堆:需要程序員自己申請,並指明大小,在C中用malloc函數。

如: p1=(char *)malloc(10);

在C++中,用new運算符,如:p2=(char *)malloc(10);

分配來的10字節的區域就在堆區。但是注意p1,p2本身是在棧中的。

2.申請後系統的響應

3.申請大小的限制

棧:是向低地址擴展的數據結構,一塊連續的內存的區域。

堆:是向高地址擴展的數據結構,是不連續的區域。

4.申請效率的比較

棧:由系統自動分配,速度較快。但程序員無法控制。

堆:是由new分配的內存,一般速度比較慢,且容易產生內存碎片,不過用起來最方便。

5.堆和棧中的存儲內容

棧:在函數調用的時候,第一個進棧的是主函數的下一條指令的地址,然後是函數的各個參數。靜態變量是不入棧的。當本次函數調用結束,局部變量先出棧,然後是參數,最後棧頂指針指向最開始存的地址。

堆:一般是在堆的頭部用一個字節存放堆的大小。堆中具體內容由程序員安排的。

6.存儲效率的比較:

在棧上的數組比指針所指向的字符串例如堆)快。

簡而言之:

 heap是堆,stack是棧。

 stack的空間是由系統自動分配和釋放的,heap上的空間需要手動分配和釋放的。

 stack空間有限,heap是由很大的自由存儲區的。

stack從最高的地址開始的往上,heap從最低的地址開始往下

 C中的malloc函數分配的內存空間即在堆上,C++對應的是new操作符。

 程序在編譯期對變量和函數分配內存都在棧上進行的,而且程序運行過程中函數調用時參數的傳遞也在棧上進行的。

首先,我們舉一個例子:

void f(){

int* p=new int[5];}

這條短短的一句話就包含了堆與棧,看到new,我們首先就應該想到,我們分配了一塊堆內存,那麼指針p呢?他分配的是一塊棧內存,所以這句話的意思就是:在棧內存中存放了一個指向一塊堆內存的指針p。


本文出自 “IT民工一枚” 博客,請務必保留此出處http://7633061.blog.51cto.com/7623061/1266378

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved