C语言栈、堆和静态区
来源:互联网 发布:头像源码怎么用 编辑:程序博客网 时间:2024/06/04 20:40
有关栈、堆的一些东西,一直搞不清,看了些网上的文章,很有帮助,把它们综合一下在这里
很多概念不清楚,大致写个东西,半个月后回来重写,到时候应该会有更清晰的理解
(C语言中文网 作者admin)堆的英文是heap;栈的英文是stack,也翻译为堆栈。堆和栈都有自己的特性,这里先不做讨论。再打个比方:一层教学楼,可能有外语教室,允许外语系学生和老师进入;还可能有数学教师,允许数学系学生和老师进入;还可能有校长办公室,允许校长进入。同样,内存也是这样,内存的三个部分,不是所有的东西都能存进去的。
静态区:保存自动全局变量和static 变量(包括static 全局和局部变量)。静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。
栈:保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。其特点是效率高,但空间大小有限。
堆:由malloc 系列函数或new 操作符分配的内存。其生命周期由free 或delete 决定。在没有释放之前一直存在,直到程序结束。其特点是使用灵活,空间比较大,但容易出错。
一位前辈写的例子
main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10); 堆
p2 = (char *)malloc(20); 堆
}
即 栈是系统自动分配空间的,例如我们定义一个 int num;系统会自动在栈上为其开辟空间。而堆(则是程序员根据需要自己申请的空间,例如用malloc函数等开辟的空间。同时由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,易出错。
关于栈与系统堆栈,在《0day安全软件漏洞分析技术》这本书的第四章里讲的很清楚。
接下来说递归中栈的应用,和上面的的概念可能会有些混淆,例如如下程序:
#include<stdio.h>
#pragma warning (disable :4996)
int age(int n)
{
int a;
if(n==1)
{
a=10;
}
else
a=age(n-1)+2;
return a;
}
int main()
{
int age_i,age_b;
printf("input the age of the tenth person\n");
scanf("%d",&age_b);
age_i=age(age_b);
printf("%d",age_i);
}
开始运行(省略变量等进栈):
1、创建main函数栈帧(设age_b=3)
2、创建age()栈帧 a:n=3创建 age()栈层a=age(2)+2
b:n=2创建age()栈层 a=age(1)+2
c:n=1 得到a=10;
3、A:弹出a=10至临时存储,删除c层,露出b栈层
B:弹出a=a+2至临时存储,删除b层,露出a层
C:弹出a=a+2至临时存储,删除a层,露出main层,传值至实参得到age_i;
结束
- C语言栈、堆和静态区
- C语言栈、堆和静态区
- C语言栈、堆和静态区
- c语言中堆、栈和静态区
- c语言-栈、堆和静态区 以及编码风格小结
- C语言编程之道 (有感 静态变量和动态变量, 静态存储方式和动态存储方式 堆+栈)
- 堆、栈和静态区
- 栈、堆和静态区
- 栈、堆和静态区
- C++:静态存储区,堆,栈区别
- C语言中的堆区和栈区
- [转]C语言中的堆区和栈区
- c语言之栈存储区和堆区理解
- 专题5-2.程序中的栈,堆,静态存储区(国嵌C语言视频)
- C语言程序内存中:静态存储区、堆、栈的区别
- c语言堆和栈的区别
- C语言中的堆和栈
- c语言堆和栈的区别
- linux 内核定时器 timer_list详解
- 我的Hook学习笔记
- data structure--Stack(基于数组实现)
- Mac装windows系统
- linux技巧:使用 screen 管理你的远程会话
- C语言栈、堆和静态区
- SVN的基本安装使用方法
- 黑马程序员_关于银行业务调度系统的设计思路
- 2.SQL Server DML触发器之COMMIT和ROLLBACK TRANSACTION
- ImportError: No module named Image IOError: decoder zip not available
- OnCreate 函数的说明
- 小团队内部竞争以及如何避免
- Linux的文件系统
- Android游戏开发想法