從不同的角度來理解堆,有不同的含義。 內(nèi)存可以簡單的概括為三個層次:
創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來,先為靈石等服務(wù)建站,靈石等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為靈石企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
1、C語言中的層次,即內(nèi)存分為靜態(tài)數(shù)據(jù)區(qū)、棧區(qū)、堆區(qū)。此時的基本單位是字節(jié)。
2、操作系統(tǒng)中的層次,即虛擬內(nèi)存。此時的基本單位是塊,比如Win32上是以4KB的頁文件來管理虛擬內(nèi)存。
3、硬件層次,即尋址電路、記憶電路。此時的基本單位是位,然后通過模塊化集成為字節(jié)、再模塊化字節(jié)更大的存儲單元 。
不同的層次,堆的概念是不一樣的,比如在層次1中,堆往往指的是malloc用戶自定義分配的內(nèi)存,從層次2上看,是有操作系統(tǒng)管理的一塊虛擬內(nèi)存,一般以堆塊來進(jìn)行管理,每個堆塊有一個屬性段,描述段是正使用、保留、還是已回收。 從層次3,則沒有任何堆、棧的概念。
棧簡單的講就是一片存儲區(qū)域(存儲區(qū)的首地址即為棧頂)
你可以向棧中存入數(shù)據(jù)取出數(shù)據(jù)刪除數(shù)據(jù)
/* Note:Your choice is C IDE */
#include "stdio.h"
#define m 100
struct Mystack/*定義棧結(jié)構(gòu)*/
{
char element[m];
int top;/*棧頂*/
};
void push(struct Mystack *s,char x) /*將x的值壓入棧頂*/
{
/* s-element[s-top]=x;
s-top++;*/
s-element[s-top]=x;
s-top++;
}
void pop(struct Mystack *s)
/*將棧頂元素刪除*/
{
s-top--;
}
int IsEmpty(struct Mystack *s)
/*判斷棧是否為空*/
{
if(s-top==0)
return 1;
else
return 0;
}
void Clearstack(struct Mystack *s)
/*清空棧元素*/
{
s-top=0;
}
void Displaystack(struct Mystack *s)
/*輸出棧元素*/
{
int i;
for(i=0;is-top;i++)
printf("%c",s-element[i]);
}
main()
{
struct Mystack st;
int i;
char ch;
for(i=0;i100;i++)
st.element[i]='\0';
st.top=0;
printf("please write a string:\n");
ch=getchar();
while(ch!='\n')
{
switch(ch)
{
case '#':
if(!IsEmpty(st))
pop(st);
break;
case '@':
if(!IsEmpty(st))
Clearstack(st);
break;
default:
push(st,ch);
}
ch=getchar();
}
printf("the string is :\n");
Displaystack(st);
}
堆(heap)和棧(stack)有什么區(qū)別??
簡單的可以理解為:
heap:是由malloc之類函數(shù)分配的空間所在地。地址是由低向高增長的。
stack:是自動分配變量,以及函數(shù)調(diào)用的時候所使用的一些空間。地址是由高向低減少的。
一個由c/C++編譯的程序占用的內(nèi)存分為以下幾個部分
1、棧區(qū)(stack)—
由編譯器自動分配釋放
,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
2、堆區(qū)(heap)
—
一般由程序員分配釋放,
若程序員不釋放,程序結(jié)束時可能由OS回收
。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表。
#define?STACK_SIZE?100?//定義棧容量為100
int?contents[STACK_SIZE];?//定義數(shù)組contents用作棧
int?top?=?0;?//定義并初始化棧頂指針為0
//函數(shù)作用:清空棧
void?make_empty(void)
{
top?=?0;?//直接將棧頂指針置0
}
//函數(shù)作用:判斷棧是否為空
bool?is_empty(void)
{
return?top?==?0;?//返回top是否等于0
}
//函數(shù)作用:判斷棧是否已滿
bool?is_full(void)
{
return?top?==?STACK_SIZE;?//返回top是否等于STACK_SIZE
}
//函數(shù)作用:向棧中壓入一個元素i
void?push(int?i)
{
if(is_full())?//如果棧已滿
stack_overflow();?//執(zhí)行棧上溢操作
else?//否則可以入棧
contents[top++]?=?i;?//向棧中壓入i,然后將棧頂指針+1
}
//函數(shù)作用:彈出棧頂元素并返回
int?pop(void)
{
if(is_empty())?//如果棧為空
stack_underflow();?//執(zhí)行棧下溢操作
else?//否則可以出棧
return?contents[--top];?//返回棧頂元素,然后將棧頂指針-1
}