1、什么是栈
   栈是一种数据结构,C语言中使用栈来保存局部变量。栈是被发明出来管理内存的。
2、栈管理内存的特点(小内存、自动化)
   先进后出  FILO   first in last out  栈
   先进先出  FIFO   first in first out      队列
  栈的特点就是入口就是出口,只有一个口,另一个口是堵死的。所以先进来的必须后出去。
  队列的特点就是入口和出口都有,必须从入口进去,从出口出来。所以先进来的必须先出去,不然就会堵住后边的。
3、栈的应用举例:局部变量
   C语言中的局部变量是用栈来实现的。
   我们在C语言中定义一个局部变量时(int a),编译器就会在栈中分配一段空间(4字节)给我们局部变量使用(分配时
   栈顶指针会移动给出空间,给局部变量a使用的意思就是,将4个字节的栈内存的内存地址和我们定义的局部变量名a给关联
   起来),对应栈的操作就是入栈。
 注意:这里栈指针的移动和内存分配是自动的(栈自己完成,不用我们写代码去操作)。
    然后等我们函数退出的时候,局部变量要灭亡。对应栈的操作就是弹栈(出栈)。出栈时也是栈顶指针移动将栈空间中
    与a关联的那4个字节空间释放。 这个动作也是栈自动完成的,也不用人写代码干预。
 栈的优点:栈管理内存,好处是方便,分配和最后回收都不用程序员操心,C语言自动完成。
 分析一个细节:C语言中,定义局部变量如果没有初始化,则值是随机的,为什么?
 定义一个局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间
 在栈上,而栈内存是反复使用的(也就是上次用完没有清零),所以说使用栈来实现的局部变量定义时,如果没有初始化,
 那么变量的值就是随机的。
 C语言是通过一个小手段来实现局部变量初始化的:
 int a = 15;         //局部变量定义时初始化
 C语言编译器会自动把这行代码转换成:
 int  a;          //局部变量定义
 a = 15;          //普通的赋值语句
4、栈的约束
 首先,栈是有大小的。所以栈内存大小不好设置。如果太小怕溢出,太大怕浪费内存。(这个缺点有点像数组)
 其次,栈的溢出危害是很大的,所以我们一定要避免。在定义局部变量的时候不能定义的太多或者是太大。(譬如:
 int a[10000];使用递归来解决问题时一定要注意递归收敛)

内存管理之栈stack的更多相关文章

  1. 解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法

    堆区:专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中) 1.存储的全部是对象 ...

  2. 面试01:解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法

    栈的使用:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间. 队的使用:通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域 ...

  3. java - 解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法

    通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间: 而通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收 ...

  4. 解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法?

    通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间:而通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集 ...

  5. 解释内存中的栈(stack)、堆(heap)和方法区(method area) 的用法?

    通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的 现场保存都使用 JVM 中的栈空间:而通过 new 关键字和构造器创建的对象则放在 堆空间,堆是垃圾收集器管理的主要区域,由于现 ...

  6. 栈 & 堆 |--> 内存管理

    内存管理: 栈区 [stack]:由编译器自动分配并释放,一般存放函数的参数值,局部变量等 堆区 [heap]:由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 全局区(静态区) ...

  7. iOS-Objective-C内存管理

    内存管理: 栈区 [stack]:由编译器自动分配并释放,一般存放函数的参数值,局部变量等 堆区 [heap]:由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 全局区(静态区) ...

  8. 全面介绍Windows内存管理机制及C++内存分配实例

    转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...

  9. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

随机推荐

  1. Local-Pref(本地优先属性)路由本地优先术

    Local-Pref(本地优先属性)路由本地优先术: ①:抓取感兴趣流量——前缀与访问——prefix and access ②:创建路由地图——router-map ③:第一法则——permit 1 ...

  2. 十三、JavaScript之跨多行的变量申明

    一.代码如下 二.运行效果 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" conten ...

  3. oracle数据泵导出导入

    先创建一个目录:比如 Create  or Replace directory  DATA_PUMP_DIR as 'D:\DataPipe';   然后给导入导出的用户赋权限: Grant read ...

  4. Web.config中executionTimeout的单位

    executionTimeout:表示允许执行请求的最大时间限制,单位为秒

  5. 如何通过模仿提升Paper写作能力?

    对于大部分初到国外留学的中国留学生们来说要想自己独立完成一篇Paper可能难度会很大,从Paper字体字号要求.Paper写作格式.Paper写作结构等等诸多因素都会影响留学生们写Paper的效率.对 ...

  6. 关于C#设计SQllite

    使用3.5框架+System.Data.SQLite,System.Data.SQLite.Ling+SQLite.Designer三个dll

  7. Python MySQL 删除表

    章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...

  8. robotframework+selenium2Library怎样不用手动关掉代理

    每次跑脚本,启动浏览器都要手动关掉代理,太费劲了,发现最简单的办法就是在局域网设置里面勾上跳过本地地址的代理服务器,并且在例外里写上127.0.0.1 就这么简单有没有??

  9. Ubuntu 14.04 搭建 ftp

    一.安装ftp服务器vsftpd $sudo apt-get update $sudo apt-get install vsftpd ftp服务器使用21端口,安装成功之后查看是否打开21端口 $ s ...

  10. OnPaint中画图遇到的问题

    在OnPaint函数中有CPaintDC dc1(this);这句话,在画图时,千万不要把它去掉,否则会造成消息队列阻塞.例如定时器.Invalidate()等都会失效. 造成这种现象的原因是: CP ...