数据区,代码区,堆区,栈区
来源:互联网 发布:美达施膳食纤维粉 知乎 编辑:程序博客网 时间:2024/04/28 12:42
一般全局变量存放在数据区,局部变量存放在栈区,
动态变量存放在堆区,函数代码放在代码区。
---------------------------------------------------------------
栈区是普通的栈数据结构,遵循LIFO后进先出的规则,局部变量安排在那里是ASM时就规定的,这样可以在一个函数结束后平衡堆栈,操作简单,效率高
堆(动态区)在这里应当叫堆栈(不要和数据结构中的堆搞混)是程序在编译时产生的一块用于产生动态内存分配使用的块,操作比较栈要麻烦许多,在分配时要判断最优的地址(防止产生无用的内存碎片(由于屡次的NEW和DELETE产生的夹在两块使用中内存中的空余小内存(不容易被分配))),分配和回收时的效率比栈低多了
---------------------------------------------------------------
栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而堆是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率>有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植>的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存匹>配是良好程序的基本要素。
现在举个例子来说明这些“段”的区别
#include
unsigned char gvch;
unsigned char short gvshort;
unsigned int gvint=0x12345645;
unsigned long gvlong=0x87654321;
void main()
{
unsigned char array[10],*p;
p=malloc(10*sizeof(char));
while(1);
}
-----------------------------------------------------------------
以上程序中代码是存放在代码区中,比如while(1);
gvch与gvshort两个全局变量由于没有付初值所以存放在:bss段中
gvint与gvlong两个全局变量付初值了所以存放在:数据段中
array数组与p变量为局部变量所以存放在:栈区
malloc函数申请的空间是属于动态的,所以保存在:堆区
- 数据区,代码区,堆区,栈区
- 数据区 代码区 堆区 栈区
- 数据区,代码区,堆区,栈区
- 数据区,代码区,堆区,栈区
- 数据区、代码区、栈区、堆区
- 数据段、代码段、栈区、堆区
- C语言拾遗:数据区,代码区,堆区,栈区
- 数据区之代码段、数据段、堆、栈
- C中的静态数据区、代码区、堆、栈
- c++内存分布,代码段、全局数据区、栈、堆
- 5.1.堆、栈、数据区、bss、代码段
- 代码区,初始化全局数据区,BSS,堆区,栈区,程序环境变量区简介
- C/C++堆区、栈区、常量区、静态数据区、代码区详解
- 代码区,初始化全局数据区,BSS,堆区,栈区,程序环境变量区简介
- 查看DEVC++程序运行的代码区、数据区、栈区、堆区的地址
- 全局区 代码区 堆区 栈区
- 堆区、栈区、全局区、代码区
- 关于“代码区,全局数据区,堆区,栈区”和“ 栈区,堆区,全局/静态存储区,常量存储区”两种不同的说法
- s3c6410的UART设备驱动(5)
- s3c6410的UART设备驱动(5)
- rs232 422 485传输区别
- Ubuntu下增加Eclipse菜单图…
- 徐小明:这次我支持房产新政
- 数据区,代码区,堆区,栈区
- stepping stone
- 优先级反转问题及解决方法
- STM32启动文件详解及SystemInit函…
- PMBOK指南(第5版)第十一章…
- oracle创建用户
- PMBOK指南(第5版)第一章习…
- UML九种图从表示机制的层次…
- 软件开发V模型