什么是堆栈以及堆栈的区别

article/2025/9/29 5:30:56

本文首发于公众号【程序员华仔】

------------------

首先说明下,这里讨论的堆和栈,是指程序内存中的“堆区”和“栈区”,并非是数据结构中所说的堆和栈。

要了解程序内存中的堆栈,需要先了解C语言的内存模型。

C语言的内存模型分为5个区:代码区,全局区,常量区,堆区和栈区。

1. 代码区

存放二进制代码区域,在ELF中称为.text段。

2.全局区

存放全局和静态变量的区域。

其中初始化的全局和静态变量在全局的一个区域,在ELF中取名为.data段。 

未初始化的全局变量和静态变量在临近一个区域, 在ELF中为.bss段。

全局区的内存由系统分配,并在程序结束后,由系统释放。

3.常量区

存储常量的区域。不允许修改。

该区的内存在程序结束的时候,由系统释放。

4.堆区(Heap)

存放程序员创建的变量的区域,是一块不连续的区域,一般使用new,alloc,calloc,malloc关键字创建的变量,这些变量需要程序员调用delete,release,free关键字才能释放。若没有调用,则会造成内存泄露。

5.栈区(Stack)

存放函数的参数,局部变量的区域,由编译器自动分配和释放。通常在作用范围域外就会释放变量。形式上类似于数据结构中栈。因为在CPU的指令集中分配内存,所以操作快且效率高。但是空间就很有限,例如iOS的栈区大小就是2M。

堆和栈概念

是一大块不连续的区域,一般使用数据结构中的链表来组织管理,在分配过程中,容易产出内存碎片。

是一小块连续的区域,一般使用队列按先进后出(First In Last Out)(FILO)的方式进行排序,并且只能在一端(栈顶(top))对数据进行插入和删除操作。

堆与栈区别

堆与栈,是操作系统对进程的内存空间的两种不同的管理方式,主要有如下几种区别:

(1)分配方式不同:

栈:由操作系统自动分配和释放,无需我们手动操作。分配方式类似数据结构中的栈。

堆:申请和释放工作由程序员自行完成,若程序员不释放,就会产生内存泄露。分配方式类似数据结构中的链表。

(2)空间大小不同:

栈:栈的空间大小远远小于堆。比如iOS栈为2M,64位的Linux默认10MB。

堆:理论上,进程可申请的堆大小为虚拟内存的大小。

(3)存放内容不同:

栈:存储函数返回地址、参数、局部变量和寄存器等内容。

堆:具体存放内容由程序员自定义填充。

(4)缓存方式不同:

栈:存放在一级缓存,被调用时放入存储空间中,调用完成就立即释放。

堆:存放在二级缓存中,一般使用引用计数(iOS)进行管理。

(5)数据结构不同:

堆:一般使用数据结构中的树来管理。

栈:一般使用先进后出的队列来管理。

(6)分配效率不同:

栈由操作系统自动分配,在CPU的指令集中完成分配并且有硬件层的支持(专门寄存器负责存储,专门指令负责压栈出栈)。

堆是由系统内核API接口来完成申请与管理,实现机制较为复杂,并且频繁的内存申请容易产生内存碎片。这样栈的分配效率比堆高多了。

以上就是堆栈的六大差异点。

iOS App内存布局

下面再看下iOS App的内存布局,下图所示。

正如上图所说一样,

1.整个内存空间中,最上面是高位地址,最下面是低位地址;

2.代码段和数据段位于最低地址位,即最底端;

3.在其之上的是堆,用来存放变量;对于ObjC来说,就是new,alloc,calloc,malloc关键字修饰的变量,堆的地址扩展方式是从低往高扩展,即当不够用的时候就往上申请空间地址

4.在往上就是栈了,主要存放函数的参数、局部变量等数据,它的扩展方式是从高往低扩展。

 

以上就是iOS App的内存布局情况,了解和掌握iOS App的内存布局情况,特别是堆栈分配以及扩展趋势,能帮助我们很好地分析定位问题。 


http://chatgpt.dhexx.cn/article/1p1B1Kyn.shtml

相关文章

php 上传文件漏洞,【文件上传】PHP文件上传漏洞

0x01 文件上传漏洞 文件上传漏洞顾名思义就是用户上传一个可执行的脚本文件,获得了执行服务器端命令的能力。通常,文件上传是getshell最常用、最直接的方式了。但是,文件上传本身是一个正常的业务需求,因此问题在于如何安全的上传…

文件上传之图片上传题目

[A]文件上传之图片上传题目 Give me your photo PLZ 提示 我好想看一些好康的图片呜呜 题目 .htaccess是Apache的又一特色。一般来说,配置文件的作用范围都是全局的,但Apache提供了一种很方便的、可作用于当前目录及其子目录的配置文件——.htaccess&…

mysql文件上传漏洞_[转载]文件上传漏洞

文件上传漏洞 实验环境: Windows 7 X64 Phpstudy 2018 PHP 5.4.45 Apache 2.4.23 靶机项目地址:https://github.com/c0ny1/upload-labs Pass01 — JS限制 开启burp抓包,尝试上传eval.php,点击上传后页面直接提示该文件不允许上传,…

文件上传upload-lads

文件上传upload-lads 第一关 前端绕过(js) 本关是对文件名的过滤(在客户端进行) 即若文件名中存在php等后缀则直接过滤(弹窗) 上传一个webshell到服务器 但只容许上传".jpg|.png|.gif"; ".jpg|.png|.gif&quo…

上传绕过php文件改为图片,文件上传绕过(二)

基于文件后缀名的绕过 同理,我们先看源码$is_upload false; $msg null; if (isset($_POST[submit])) { if (file_exists($UPLOAD_ADDR)) { $deny_ext array(.asp,.aspx,.php,.jsp); $file_name trim($_FILES[upload_file][name]); $file_name deldot($file_nam…

文件上传思路总结

#思路总结 当遇到js前端脚本限制上传文件类型当服务器检测上传文件的MIME类型即媒体类型时文件头校验后端设置了后缀名黑名单文件解析漏洞htaccess文件大小写绕过加空格绕过加点绕过::$DATA绕过点加空格加点绕过双写绕过 后端设置了后缀名白名单当只能上传图片文件时&#xff0…

细说——文件上传漏洞(另附文件上传靶场通关记录)

目录 漏洞描述漏洞危害常见上传点和绕过方式上传点后缀绕过解析漏洞常见绕过类型 脑图漏洞在系统中的差异IIS 5.x/6.0解析漏洞Nginx 解析漏洞Apache 解析漏洞 靶场环境准备理解文件上传Pass-1-js检查【前端绕过】Pass-2-只验证Content-type【考核:MIME绕过】Pass-3-…

文件上传漏洞获取服务器,渗透测试-文件上传漏洞

声明:文中出现的ip为练习靶场,本文仅供学习,旨在学习web安全,不允许任何侵权行为 WebShell与WebShell管理工具 文件上传漏洞概述 文件上传漏洞绕过 文件上传漏洞防御 一、WebShell与WebShell管理工具 什么是WebShell webshell&…

php文件上传小结,文件上传总结

检测维度 javascript 检查没有流量产生,F12或者FireBug移除JS代码 MIME MIME检测,burp拦截后更改MIME类型 if($_FILES[userfile][type] ! "image/gif") { // check Content-type 目录路径 需要存储路径可控(或文件名完全可控) 00截断 $FilePat…

上传漏洞上传方法总结

title: 上传漏洞[汇总] copyright: true top: 0 date: 2018-07-31 22:40:47 tags: 上传漏洞 categories: 渗透测试 permalink: password: keywords: description: 对上传漏洞的大部分上传方式作总结。 最后必然失去的希望就是毒药啊。 个人对上传漏洞的理解在第一章节就说过了&…

php 文件上传抓包,详解文件上传漏洞

介绍 在现代互联网网站中,上传文件基本上是一种常见的功能,允许用户上传一些图片,视频以及其他类型的文件。如果网站出现文件上传漏洞,那么恶意用户就可以将可执行脚本程序上传到web服务器中,获得网站权限,进一步 gongji web服务器。 当上传文件时,如果服务端未对客户端…

文件上传漏洞总结

文件上传 文件上传漏洞产生的原理 文件上传漏洞是指用户通过界面上的上传功能上传了一个可执行的脚本文件,而WEB端的系统并未对其进行检测或者检测的逻辑做的不够好。 文件上传漏洞的危害 1、由于是上传的文件,所以文件由用户决定,上传we…

php 上传文件触发,PHP文件上传漏洞浅析

PHP文件上传漏洞的浅析。 文件上传简介 在一个正常的网站中,通常都会存在一些允许用户上传文件的地方。但是有一些上传功能的地方没有对用户上传的内容进行过滤,导致会上传木马到服务器并执行命令,甚至控制服务器的权限。 文件上传实现 前端代…

文件上传漏洞

文件上传漏洞 1. 文件上传功能 文件上传功能是大部分WEB应用的必备功能,站点常见文件上传点有:用户头像上传、社交类网站允许用户上传照片、服务类网站需要用户上传证明材料的电子档、电商类网站允许用户上传图片展示商品情况等。然而,看似…

java fckeditor 上传图片_java下FCKeditor上传图片问题

展开全部 先到tomcat->webapps里建立一个文件夹叫mysite。把FCKeditor里的/editor和fckconfig.js, fckeditor.js, fckstyles.xml, fcktemplates.xml四个文件copy到mysite文件夹里,因为别的文件对我32313133353236313431303231363533e58685e5aeb931333239303264们…

Consider defining a bean of type ‘com.course.server.mapper.TestMapper‘ in your configuration.

问题 Description:A component required a bean of type com.course.server.mapper.TestMapper that could not be found.Action:Consider defining a bean of type com.course.server.mapper.TestMapper in your configuration.解决 我用了mybatis,在mapper层忘记…

@ManyToMany mappedby

学生和老师就是多对多的关系。一个学生有多个老师,一个老师教多个学生。多对多映射采取中间表连接的映射策略,建立的中间表将分别引入两边的主键作为外键。jpa 对于中间表的元数据提供了可配置的方式,用户可以自定义中间表的表名,…

MapDB简单用法

MapDB提供了Java映射、集、列表、队列和其他由非堆或磁盘存储支持的集合。它是java集合框架和嵌入式数据库引擎之间的混合。它是Apache许可下的免费和开放源码。 如果处理GB级数据,请考虑使用非缓存存储容器,比如本篇提到的MapDB,而不要把庞大…

BaseMapper

* 1.公共的方法进行抽取,抽取到BaseMapper接口中,将用户操作的方法对象,转化为数据库能够识别的SQL语句 * 2.通过userMapper查找父级接口BaseMapper * 3.根据BaseMapper查找泛型对象User对象 * 4.根据user对象查找指定的注解TableName,获取表明 * 5.根据user对象的属性,动态获取…

MappedBy

对于mappedBy复习下: a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性; b) mappedBy标签一定是定义在the owned side(被拥有方的),他指向the owning side(拥有方); c) mappedBy的含义…