黑马程序员技术交流社区

标题: 关于栈(stack)、堆(heap)笔记 [打印本页]

作者: 世年单    时间: 2016-1-13 00:40
标题: 关于栈(stack)、堆(heap)笔记
栈(stack)、堆(heap)

概念:堆和栈都是数据结构,是一个特殊的存储区,主要用来暂时存放数据和地址。

栈:其同数据结构中的栈类似。用于存储参数和局部变量。该存储空间不用申请,有操作系统自动分配和释放。

      栈在中文中就说一个仓库,所以类似仓库你先放进去的最后才能取出。也就类似先放进去的最后释放。其实栈是相对较高的地址,以地址的增长方向为上的话,栈地址是向下增长的。

      优点:读取速度较堆要快,

      缺点:灵活性低,数据大小和生命周期有限。栈中存放的数据无法在多线程之间共享。

堆:其同数据结构中的栈不是一个概念。要有程序员自己申请和释放,如果不释放可能在程序结束时,有系统收回。其遵循先进先出的原则。

     优点:比较灵活,能够自己规定分配内存的大小,编译器无法获知其生命周期。

     缺点:由于在运行时才能分配动态空间,会降低运行速度。

具有存储概念的名词还有:全局去,文字常量区,程序代码区

全局区:有static修饰的变量,全局变量和静态变量的存储是放在一块的,程序结束后由系统释放。

文字常量区:有程序结束后系统释放。一些常量字符串就存储在该区。

程序代码区:将代码转换成二进制后存储的区域。

栈就例如我们只要结果,而不必担心如何达到这个结果。

而堆就要为自己的结果负责,自己的行为造成自己的结果。

注意:

1)在main函数之外的都是存储在全局区。

2)在main函数内部,有static 修饰的是全局区。

    变量都处于栈中,字符串是位于常量区。

    分配空间的语句造成的分配在堆。

  这是一个前辈写的,非常详细   
  //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);   
  分配得来得10和20字节的区域就在堆区。   
  strcpy(p1,   "123456");   123456/0放在常量区,编译器可能会将它与p3所指向的"123456"  
  优化成一个地方。   
  }   



作者: 黑人奥巴马    时间: 2016-1-13 00:51
碉堡了 我擦 年吊起
作者: 黑人奥巴马    时间: 2016-1-13 01:14
铁锤砸蛋的表演第一人 !!!
作者: 雨来    时间: 2016-1-19 23:12
再通俗一点就好 了
作者: guyuexing    时间: 2016-1-19 23:18
写的真好




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2