C语言堆栈入门——堆和栈的区别借鉴.pdfVIP

  • 0
  • 0
  • 约4.32千字
  • 约 4页
  • 2021-12-10 发布于福建
  • 举报

C语言堆栈入门——堆和栈的区别借鉴.pdf

2010 年 1 月 29 日 C 语 言 堆 栈 入 门 — — 堆 和 栈 的 区 别 原 文 : /link.php?url=%2Fjiaoshi%2Fhtml%2F427 .html 在计算机领域,堆栈是一个不容忽视的概念,我们编写的 C 语言程序基本上都要用到。但对 于很多的初学着来说,堆栈是一个很模糊的概念。堆栈:一种数据结构、一个在程序运行时 用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆 栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆 栈,所以我想有必要给大家分享一下我对堆栈的看法, 有说的不对的地方请朋友们不吝赐教, 这对于大家学习会有很大帮助。 数据结构的栈和堆 首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构: 堆和栈。 堆和栈都是把一些数据项按序排列的数据结构。 我们先从大家比较熟悉的栈说起吧: 栈就像装数据的桶或箱子,它是一种具有“后进先出”性质的数据结构,也就是说后存 放的先取,先存放的后取。这就如同我们要取出放在箱子里面底下的东西(放入的比较早的 物体当然就压在底下了, ),我们首先要移开压在它上面的物体(放入的比较晚的物体) 。 堆像一棵倒过来的树 而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的 堆的数据结构, 是指二叉堆。 堆的特点是根结点的值最小 (或最大),且根结点的两个子树也 是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图 书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先 取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。 内存分配中的栈和堆 然而我要说的重点并不在这,我要说的堆和栈并不是数据结构的堆和栈,之所以要说数 据结构的堆和栈是为了和后面我要说的堆区和栈区区别开来,请大家一定要注意。 下面就说说 C 语言程序内存分配中的堆和栈,这里有必要把内存分配也提一下,大家不 要嫌我啰嗦,一般情况下程序存放在 Rom或 Flash 中,运行时需要拷到内存中执行,内存会 分别存储不同的信息,如下图(数据在内存中的存储图示)所示: 0xc0000000 内核虚拟内存 ——有内核使用 栈区 -- 程序运行时用于存放局部变量,可向下延展空间 0共享库的内存影像 程序运行是用于分配 malloc 和 new 申请的区域 堆区 的用于分配程序员申请的内存空间 可读写区( .data.bss )-- 用于存放全局变量和静态变量 0408048000 只读区 存放程序和常量等 0 未使用区 内存中的栈区处于相对较高的地址,栈是向下增长的。 栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。另外还有静态 区是分配静态变量,全局变量空间的;只读区是分配常量和程序代码空间的;以及其他一些 分区。 来看一个网上很流行的经典例子: 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); 堆 } 0. 申请方式和回收方式不同 不知道你是否有点明白了,堆和栈的第一个区别就是申请方式不同:栈(英文名称是 stack )是系统自动分配空间的,例如我们定义一个 char a ;系统会自动在栈上为其开辟空 间。而堆(英文名称是

文档评论(0)

1亿VIP精品文档

相关文档