数据区,代码区,堆区,栈区

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一般全句变量存放在数据区,局部变量存放在栈区,动态变量存放在堆区,函数代码存放在代码区。

栈区是普通的栈数据结构。遵循LIFO后进先出的规则。局部变量安排在那里可以在一个函数结束后平衡堆栈,操作简单,效率高。

堆区这里应该叫堆栈(不要和数据结构中的堆搞混),是程序在编译时产生的一块用于产生动态内存分配使用的块。操作比较栈要麻烦许多。在分配时要判断最优的地址(防止产生无用的内存碎片(由于屡次的NEW和DELETE产生的夹在两块使用中内存中的空余小内存(不容易分配)))。分配和回收时的效率比栈低多了。

栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而堆是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是料率有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法相互操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量的分配。动态分配由malloc函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植程序起见,栈的动态分配操作是不被鼓励的。堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存是良好程序的基本要素。

举个例子说明这些“段”的区别:

#include

Unsigned char gvch;

Unsigned char gvshort;

Unsigned int gvint=71328;

Unsigned long gvlong=427399;

V oid main()

{

Unsigned char array[10],*p;

P=malloc(10*sizeof(char));

While(1);

}

以上程序中代码是存放在代码区中,比如while(1);

Gvch与gvshort两个全局变量由于没有赋初值存放在:bss段中

Gvint与gvlong两个全局变量赋初值了存放在:数据段中

Array数组与p变量wieiqwo局部变量存放在:栈区

Malloc函数申请的空间是属于动态的存放在:堆区

相关文档
最新文档