十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
从不同的角度来理解堆,有不同的含义。 内存可以简单的概括为三个层次:
创新互联公司自2013年创立以来,先为灵石等服务建站,灵石等地企业,进行企业商务咨询服务。为灵石企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
1、C语言中的层次,即内存分为静态数据区、栈区、堆区。此时的基本单位是字节。
2、操作系统中的层次,即虚拟内存。此时的基本单位是块,比如Win32上是以4KB的页文件来管理虚拟内存。
3、硬件层次,即寻址电路、记忆电路。此时的基本单位是位,然后通过模块化集成为字节、再模块化字节更大的存储单元 。
不同的层次,堆的概念是不一样的,比如在层次1中,堆往往指的是malloc用户自定义分配的内存,从层次2上看,是有操作系统管理的一块虚拟内存,一般以堆块来进行管理,每个堆块有一个属性段,描述段是正使用、保留、还是已回收。 从层次3,则没有任何堆、栈的概念。
栈简单的讲就是一片存储区域(存储区的首地址即为栈顶)
你可以向栈中存入数据取出数据删除数据
/* Note:Your choice is C IDE */
#include "stdio.h"
#define m 100
struct Mystack/*定义栈结构*/
{
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)有什么区别??
简单的可以理解为:
heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。
stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)—
由编译器自动分配释放
,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)
—
一般由程序员分配释放,
若程序员不释放,程序结束时可能由OS回收
。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
#define STACK_SIZE 100 //定义栈容量为100
int contents[STACK_SIZE]; //定义数组contents用作栈
int top = 0; //定义并初始化栈顶指针为0
//函数作用:清空栈
void make_empty(void)
{
top = 0; //直接将栈顶指针置0
}
//函数作用:判断栈是否为空
bool is_empty(void)
{
return top == 0; //返回top是否等于0
}
//函数作用:判断栈是否已满
bool is_full(void)
{
return top == STACK_SIZE; //返回top是否等于STACK_SIZE
}
//函数作用:向栈中压入一个元素i
void push(int i)
{
if(is_full()) //如果栈已满
stack_overflow(); //执行栈上溢操作
else //否则可以入栈
contents[top++] = i; //向栈中压入i,然后将栈顶指针+1
}
//函数作用:弹出栈顶元素并返回
int pop(void)
{
if(is_empty()) //如果栈为空
stack_underflow(); //执行栈下溢操作
else //否则可以出栈
return contents[--top]; //返回栈顶元素,然后将栈顶指针-1
}