下面的程序可以正常运行,但是如果注释掉定义变量b这行代码,程序在运行时直接崩溃,请说明这种现象的原因。

int main(){

cahr *a=new char[32];

int b[8];

int c[128];

c[128]=0;

c[129]=0;

c[130]=0;

strcpy(a,"hello");

cout<<a<<endl;

}

  • 程序中显然存在内存越界问题,由于通过下标对数组元素赋值时不会自动检测下标越界,因此程序在相应的地址上进行赋值,这样造成的结果就是可能错误地修改了其他变量的值。
  • 函数的局部变量保存在栈空间中,根据栈后进先出的性质,指针a保存在栈底,占用四个字节,之后是数组b,占用32个字节,栈顶元素是数组c,占用512个字节。实际的内存布局可能稍有变化,但原则是按照变量在函数中声明的顺序依次入栈。
  • 当数组c赋值时发生了内存越界,实际改变了数组b中某些元素的值,由于程序并未对数组b中的元素进行任何操作,因此程序运行时并没有什么异常,程序也会正确地输出。
  • 如果注释掉数组b这行代码,程序运行就会出问题了。此时内存布局更加简单,栈底元素是指针a,占用4个字节,栈顶元素是数组c,占用512个字节,其中指针a指向堆中一块动态分配的内存。
  • 下面三个赋值语句由于发生了内存越界问题,赋值操作胡导致指针a的值变为0,不再指向堆空间。这时候堆中动态分配的内存没有任何指针指向它,既无法使用,也无法释放,从而导致内存泄露。
  • 由于地址编码为0的内存属于保护段,因此不能够操作这段内存,修改保护段的内存会导致程序崩溃。程序中字符串拷贝语句试图将字符串“hello”拷贝到内存为0的内存空间中,违反了保护段内存不能修改的原则,因此在执行字符串拷贝时程序崩溃。

越界操作导致程序崩溃的原理相关推荐

  1. OpenCV中waitKey()函数失效问题汇总(按键失效、按键不灵、按键导致程序崩溃)

    提示:阅读文章,大约需要3分钟 问题描述 在使用OpenCV编程的时候,我们经常会使用按键等待函数:waitKey(),大家可能会用它来作为 延迟.等待用户输入按键的功能使用,以下列出了在使用过程中遇 ...

  2. goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题。recover panic 协程的错误处理

    package mainimport ("fmt""time" )//goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题. f ...

  3. laravel清理缓存(config:clear)后导致程序崩溃

    laravel清理缓存(config:clear)后导致程序崩溃 前情提要:导致这个错误的可能性有很多,如此不人性化的提示是因为在config:clear后laravel重载出错,然后尝试从log输出 ...

  4. MFC使用GetDlgItem获取控件导致程序崩溃的问题

    对于MFC窗口,在没有被创建完成时,是无法获取控件资源的.如果将GetDlgItem写在窗口类构造函数中,就会导致程序崩溃 正确方法是将GetDlgItem放在窗口类的OnInitDialog函数中执 ...

  5. unity openxr导致导致程序崩溃的一种可能

    程序忽然发生了点击运行就崩溃的灾难, 崩溃无数次后从log中摘录出来的,总体来说大的error就是这些了 [XR] [38468] [15:34:14.581][Error ] xrGetSystem ...

  6. c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题

    代码 总结下c语言中字符串数组的地址存放问题 #include <iostream> using namespace std; #include<bits/stdc++.h>i ...

  7. 内存越界一定会导致程序崩溃吗?详解内存越界

    目录 1.什么是内存越界? 1.1.对数组的读越界 1.2.执行strcpy时的写越界 1.3.执行memcpy时的写

  8. c# Linq Where 抛出异常 导致 程序崩溃

    <?xml version="1.0" encoding="UTF-8"?> Collection was modified; enumeratio ...

  9. 【北亚数据恢复】infortrend服务器raid6硬盘离线后进行上线操作导致服务器崩溃的数据恢复

    环境: 服务器型号:infortrend ESDS-S12F-G1440: 12块单盘容量为2TB的硬盘组成raid6磁盘阵列: 阵列上有一个lun,映射到WINDOWS系统上使用: 在WINDOWS ...

  10. linux自动断开会话,linux – 从SSH会话断开连接是否会导致程序崩溃?

    编辑2016年: 这个Q& A早于systemd v230 debacle.从systemd v230开始,新的默认设置是终止终止登录会话的所有子节点,无论采取了哪些历史上有效的预防措施来防止 ...

最新文章

  1. 一次性搞定权限树遍历(通用解决方案)
  2. mysql团队开发工具_最棒的10款MySQL GUI工具
  3. 正则表达式判断邮箱、身份证..是否正确
  4. 我们真的需要JWT吗?
  5. CPU8085 8086名字的由来
  6. mfc大观之五、六(消息机制和消息运行)
  7. python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
  8. c语言函数调用带参数,C语言函数 -C语言函数调用和参数传递
  9. java计费系统_Java网吧计费系统
  10. 本地以图搜图识图工具——嗅图狗!(python3.6实现图像比对指路,代码git)
  11. 抖音热门音乐整理合集歌曲打包分享
  12. LabWindows/CVI学习总结——前言
  13. RealAI:清华团队打造第三代安全可控人工智能 | 百万人学AI评选
  14. uni 页面加载完毕_uniapp小程序如何等待数据回来才加载页面?
  15. [POI 2004]ZAW
  16. Halcon 单目标定,畸变矫正,图像坐标系转世界坐标系
  17. 服装行业拼的是实力——智能制造
  18. 中国首届微博开发者大会杨卫华演讲
  19. mysql获取汉字拼音首字母_MySQL数据库获取汉字拼音的首字母函数
  20. Android 友盟分享 开发日记

热门文章

  1. Android查看appPackage和Activity的多种方法
  2. 2019物联网博览会专业展览会-参加展会我们最专业
  3. 使用Jest对原生TypeScript项目进行UI测试
  4. oracle ADF 代码标准
  5. Tomcat下work文件夹的作用
  6. maven项目的构建
  7. CentOS 6.6 HAProxy安装配置指南
  8. wxpython仿写记事本
  9. Exadata:Smart Scan(二) FAST FULL SCAN
  10. 兼容IE和FF的js脚本做法