内存管理之栈

内存管理之栈(stack)

什么是栈?

栈是一种数据结构,c语言中使用栈来保存局部变量。栈是被发明出来管理内存的。1.4.7.2、 栈管理内存的特点(小内存、自动化)

先进后出FILO  first in last out  栈先进先出

    FIFO  first in first out  队列

栈的特点是入口即出口,只有一个口,另一个口是堵死的。所以先进去的必须后出来。

队列的特点是入口和出口都有,必须从入口进去,从出口出来,所以先进去的必须先出来,否则就堵住后面的

栈的应用举例:局部变量

C语言中的局部变量是用栈来实现的。我们在c中定义一个局部变量时( int a),编译器会在栈中分配一段空间(4字节)给这个局部变量用(分配时栈顶指针会移动给出空间,给局部变量a用的意思就是,将这4字节的栈内存的内存地址和我们定义的局部变量名a给关联起来),对应栈的操作是入栈。

注意,这里栈指针的移动和内存分配是自动的(栈自己完成,不用我们写代码去操作)

然后等我们函数退出的时候,局部变量要灭亡。对应栈的操作是弹栈(出栈)。出栈时也是栈顶指针移动将栈空间中与a关联的那4个字节空间释放。这个动作也是自动的,也不用人写代码干预。

栈的优点:栈管理内存,好处是方便,分配和最后回收都不用程序员操心,c语言自动完成。

分析一个细节: c语言中,定义局部变量时如果未初始化,则值是随机的,为什么?

定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的),所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是脏的。如果你显式初始化怎么样?C语言是通过一个小手段来实现局部变量的初始化的。int a= 15; //局部变量定义时初始化

C语言编译器会自动把这行转成:

int a; //局部变量定义

a=15; //普通的赋值语句

栈的约束(预定栈大小不灵活,怕溢出)

首先,栈是有大小的。所以栈内存大小不好设置。如果太小怕溢出,太大怕浪费内存(这个缺点有点像数组)其次,栈的溢出危害很大,一 定要避免。所以我们在c语言中定义局部变量时不能定义太多或者太大(譬如不能定义局部变量时int a[10000]; 使用递归来解决问题时一定要注意递归收敛)

原文地址:https://www.cnblogs.com/sanshijvshi/p/10269360.html

时间: 2024-11-01 11:20:16

内存管理之栈的相关文章

内存管理:栈(stack) 和 栈溢出

程序的虚拟地址空间分为多个区域,栈是其中地址较高的一个区域. 栈可以存放函数参数.局部变量.局部数组等作用范围在函数内部的数据,它的作用就是完成函数的调用. 栈的概念 栈溢出(Stack Overflow) 对于每个程序来说,栈能使用的内存是有限的,一般是1M - 8M,这在编译时就已经决定了,程序运行期间不能改变. 如果程序使用的栈内存超出最大值,就会发生栈溢出错误. 一个进程可以包含多个线程,每个线程都有自己的栈,严格来说,栈的最大值是针对线程来说的,而不是针对进程. 栈内存的大小和编译器有

转:C/C++内存管理详解 堆 栈

http://chenqx.github.io/2014/09/25/Cpp-Memory-Management/ 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支

转:内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]

内存区划分.内存分配.常量存储区.堆.栈.自由存储区.全局区[C++][内存管理][转载] 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域.- 程序结束释放4.另外还有一个专门放常量的地方.- 程序结束释放                          

(c/c++内存管理)堆和栈的区别

摘要:内存管理向来是C/C++程序设计的一块雷区,大家都不怎么愿意去碰她,但是有时不得不碰它.虽然利用C++中的smart   pointer已经可以完全避免使用指针,但是对于对于指针的进一步了解,有助于我们编写出更有效率的代码,也有助于我们读懂以前编写的程序. 五大内存分区 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆,就是那些由n

栈 & 堆 --> 内存管理

内存管理: 栈区 [stack]:由编译器自动分配并释放,一般存放函数的参数值,局部变量等 堆区 [heap]:由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 全局区(静态区) [static]:全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放 文字常量区:存放常量字符串,程序结束后由系统释放 程序代码区:存放函数的二进制代码 官方文档: 在iOS开发中: 一. 内存分析

栈帧的组织——C/C++内存管理必须掌握的

程序栈 说到栈帧,不得不先说说程序栈. 程序栈是支持函数执行的内存区域,通常和堆共享.程序栈通常占据内存区域的下部,而堆用的是上部. 程序栈存放栈帧,栈帧有时候也称为活跃记录或活跃帧.栈帧存放函数参数和局部变量.堆存放动态内存. 调用函数时,函数的栈帧被推到栈上,栈向上长出一个栈帧.当函数终止时,其栈帧从程序栈上弹出.栈帧所使用的内存不会被清理,但是最终可能会被推到程序栈上的另一个栈帧覆盖. 动态分配的内存来自堆,堆向下生长.随着内存的分配与释放,堆中会布满碎片.尽管堆是向下生长的,但是这只是大

堆内存 栈内存 虚拟内存 动态内存管理

从编译器角度来看内存分三种情况: 1 系统初始化时都已经确定好.不会再变动的内存区域,一般指的是全局变量.静态变量数组等. 2 栈上内存:一般指的是函数内部的局部变量等,函数调用时分配内存,调用结束后系统自动释放不用自己考虑回收,效率高.有时候栈需要自己设定,设定不当可造成栈溢出. 3 堆上内存:即用动态分配函数分配的内存属于堆上内存,适合那些有MMU(内存管理).开始不确定需要申请多大内存的场合.注意:利用动态分配内存函数,使用完毕要及时释放内存和将指针清0,否则容易产生野指针和内存泄露.因为

内存管理——堆与栈

程序变量分区中栈和堆的区别 (1)申请方式 stack: 由系统自动分配. 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间. heap: 需要程序员自己申请,并指明大小,在C中malloc函数,C++中是new运算符. 如p1 = (char *)malloc(10); p1 = new char[10]; 如p2 = (char *)malloc(10); p2 = new char[20]; 但是注意p1.p2本身是在栈中的. (2)申请后系统的响应 栈:只要栈的剩

linux内存管理

一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分:    1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程序可调用它.假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段.     2) 数据段:存放已初始化的全局变量.静态变量(包括全局和局部的).常量.static全局变量和static函数只能在当前文件中被调用.     3) 未初始化数据区(uninitializeddata s