简介

本文介绍了如下内容

1.栈的概念

2.为什么会发生栈溢出

3.栈溢出的几种栗子

4.怎么预防和发现栈溢出。

1 什么是栈?

1. 从数据结构来说:栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

2. 在计算机系统中:栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。

3.栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。堆栈帧一般包含如下几方面的信息:

临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。

函数的返回地址和参数

2.什么是栈溢出?

栈溢出就是缓冲区溢出的一种。 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。缓冲区长度一般与用户自己定义的缓冲变量的类型有关。

3. iOS/Mac栈的大小是多少?

1. iOS上主线程栈空间大小为1MB

2. iOS上子线程栈空间大小为512KB

3. Mac OS上主线程栈大小为8MB

PS:对于子线程,线程的栈大小是在线程创建的时候就创建好的,但是只有实际使用到的时候才会分配到具体内存;同时,子线程能够允许的最小栈大小为16KB,且栈的大小必须是4KB的整数倍。

4. 哪些情况会造成栈溢出

1.栈上变量直接分配内存长度超过栈空间大小,如下

int buf[1024*1024] = {0}

对应的崩溃日志,一般情况下遇见有"Stack Guard"的关键字,就表示程序发生栈溢出导致闪退了

2. 间接使用操作栈上内存超限的函数,包括但不限于以下函数

void *memcpy(void *__dst, const void *__src, size_t __n);

void *memmove(void *__dst, const void *__src, size_t __len);

char *strcpy(char *__dst, const char *__src);

char *strncpy(char *__dst, const char *__src, size_t __n);

举个栗子:

void function1(char *str){

    int32_t maxsize = 100*1024*1024;

    char buffer[maxsize];

    //strcpy(buffer, str);

    memcpy(buffer, str, maxsize);

}

  char *a = malloc(1024*1024);

  function1(a);

来个崩溃日志,关键字还是`Stack Guard`哦。

3.无限递归调用,见如下斐波那契数列函数递归实现

int  fibonacci(int n){

    if (n == 1) {

       return 1;

    }

    if (n == 2) {

        return 2;

    }

    return  fibonacci(n) * fibonacci(n - 1);

}

再来个崩溃日志给大家瞧瞧,不要钱哦,关键字还是`Stack Guard`!

5. 怎么避免栈溢出崩溃?

1.栈上申请内存不要超过512KB,建议超过100KB以上的内存申请,都使用堆上的内存分配方式,“malloc”,“calloc”等

2. 使用操作内存读写的系统函数时,保证大内存的内存操作在堆上进行

3. 避免使用递归,所有的递归都可以使用循环实现。

6. 参考文献

1.百度百科-栈:https://baike.baidu.com/item/%E6%A0%88/12808149?fr=aladdin

2.百度百科-栈溢出:https://baike.baidu.com/item/%E6%A0%88%E6%BA%A2%E5%87%BA/8538051?fr=aladdinhttps://baike.baidu.com/item/%E6%A0%88%E6%BA%A2%E5%87%BA/8538051?fr=aladdin

3.Apple Thread Management:https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html

iOS上栈溢出崩溃详解相关推荐

  1. IOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem

    转:http://blog.csdn.net/totogo2010/article/details/7681879 1.UINavigationController导航控制器如何使用 UINaviga ...

  2. iOS里面MVC模式详解

    iOS里面MVC模式详解 MVC是IOS里面也是很多程序设计里面的一种设计模式,M是model,V是view,C是controller.MVC模式在ios开发里面可谓是用得淋漓尽致. 以下是对斯坦福大 ...

  3. iOS开发证件要点详解

    iOS开发证书要点详解 引言 关于开发证书配置(Certificates&Identifiers&Provisioning Profiles),相信做iOS开发的同学没少被折腾.对于一 ...

  4. iOS APP上架流程详解

    iOS APP上架流程详解 青葱烈马 2016.04.28  前言:作为一名 iOS 开发工程师, APP 的上架是必备技能. iOS 上架的流程主要可以简单总结为: 一个包,两个网址,三个证书, 一 ...

  5. iOS中ImageIO框架详解与应用分析

    2019独角兽企业重金招聘Python工程师标准>>> iOS中ImageIO框架详解与应用分析 一.引言 ImageIO框架提供了读取与写入图片数据的基本方法,使用它可以直接获取到 ...

  6. iOS动画-CAAnimation使用详解

    理解了隐式动画后,显式动画就更加通俗易懂了.区别于隐式动画的特点,显式动画就是需要我们明确指定类型.时间等参数来实现效果的动画.除此之外,我们也可以创建非线性动画,比如沿着任意一条曲线运动等: 我们平 ...

  7. [置顶] iOS中 支付宝钱包详解/第三方支付

    [置顶] iOS中 支付宝钱包详解/第三方支付 韩俊强的博客 每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 一.在app中成功完成支付宝支付的过程 1.申请支付 ...

  8. Flutter开发之iOS后台定位开发详解

    Flutter开发之iOS后台定位开发详解 需求目的 开发一个功能持续获取用户的位置发送给后端,PC端会根据后端传来的移动端发送的位置信息,来绘制使用者的运动轨迹. 实现需求 是否实现 后台定位 ✅ ...

  9. “iOS 推送通知”详解:从创建到设置到运行

    "iOS 推送通知"详解:从创建到设置到运行 转自 http://www.csdn.net/article/2012-02-18/311976 这是一篇编译的文章,内容均出自Par ...

  10. Cisco ××× 完全配置指南-连载-IOS ×××阶段2连接详解

    Cisco ××× 完全配置指南-连载-IOS ×××阶段2连接详解 详细配置见附件 转载于:https://blog.51cto.com/xuanbo/151764

最新文章

  1. AI根据视频画面自动配音 ,真假难辨 !(附数据集)
  2. 田志刚:写文章的两个好处
  3. XenStore: 使用,结构和原理
  4. hashmap的五种便利方式
  5. python找水仙花数_Python一句代码实现找出所有水仙花数的方法
  6. Android webView 缓存 Cache + HTML5离线功能 解决
  7. jquery与ajax的XMLHttpRequest对象介绍
  8. RPA如何助力企业解决人才短缺难题?
  9. 萌新向Python数据分析及数据挖掘 第三章 机器学习常用算法 第四节 PCA与梯度上升 (上)理解篇...
  10. Dell Alienware 13 R3 win10 安装 ubuntu 18.04 总结
  11. 在混合开发框架模式中,简化客户端对Web API的频繁调用
  12. 利用sklearn进行豆瓣电影评论的文本分类
  13. How to support Specular-Glossiness in Three.js
  14. 网易校招笔试第三题匈牙利算法
  15. 从期货开户公司分享交易所手续费返还
  16. 菜单栏、工具栏、状态栏
  17. 求职简历中一些常见的问题
  18. 机器学习:房价预测项目实战
  19. HTML <style> 标签
  20. 考研数学复习建议与资料

热门文章

  1. geek_How-To Geek正在寻找远程全职技术作家
  2. php生成mp4文件,PHP实现将视频转成MP4并获取视频预览图的方法
  3. 两台计算机上用网线共享打印机共享,怎么将打印机共享两台计算机用一根网线,其中一台有打...
  4. 言语中心理解题(必要条件,程度词,并列关系)
  5. 3 a 5的c语言表达式,C语言中,赋值表达式:(a=3*5)=4*3,为什么整个表达式的值为1,表达式x=(a=3,6*a)和表达式x=a=3,6*a分别是...
  6. ECMAScript - 字符串的部分使用方法
  7. Ubuntu系统下的实用软件推荐
  8. BZOJ 5442 [Ceoi2018]Global warming
  9. 遍历目录 nftw and ftw
  10. rd630服务器系统,联想thinkserverRD630安装windowsserver2012