越界操作导致程序崩溃的原理
下面的程序可以正常运行,但是如果注释掉定义变量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的内存空间中,违反了保护段内存不能修改的原则,因此在执行字符串拷贝时程序崩溃。
越界操作导致程序崩溃的原理相关推荐
- OpenCV中waitKey()函数失效问题汇总(按键失效、按键不灵、按键导致程序崩溃)
提示:阅读文章,大约需要3分钟 问题描述 在使用OpenCV编程的时候,我们经常会使用按键等待函数:waitKey(),大家可能会用它来作为 延迟.等待用户输入按键的功能使用,以下列出了在使用过程中遇 ...
- goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题。recover panic 协程的错误处理
package mainimport ("fmt""time" )//goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题. f ...
- laravel清理缓存(config:clear)后导致程序崩溃
laravel清理缓存(config:clear)后导致程序崩溃 前情提要:导致这个错误的可能性有很多,如此不人性化的提示是因为在config:clear后laravel重载出错,然后尝试从log输出 ...
- MFC使用GetDlgItem获取控件导致程序崩溃的问题
对于MFC窗口,在没有被创建完成时,是无法获取控件资源的.如果将GetDlgItem写在窗口类构造函数中,就会导致程序崩溃 正确方法是将GetDlgItem放在窗口类的OnInitDialog函数中执 ...
- unity openxr导致导致程序崩溃的一种可能
程序忽然发生了点击运行就崩溃的灾难, 崩溃无数次后从log中摘录出来的,总体来说大的error就是这些了 [XR] [38468] [15:34:14.581][Error ] xrGetSystem ...
- c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题
代码 总结下c语言中字符串数组的地址存放问题 #include <iostream> using namespace std; #include<bits/stdc++.h>i ...
- 内存越界一定会导致程序崩溃吗?详解内存越界
目录 1.什么是内存越界? 1.1.对数组的读越界 1.2.执行strcpy时的写越界 1.3.执行memcpy时的写
- c# Linq Where 抛出异常 导致 程序崩溃
<?xml version="1.0" encoding="UTF-8"?> Collection was modified; enumeratio ...
- 【北亚数据恢复】infortrend服务器raid6硬盘离线后进行上线操作导致服务器崩溃的数据恢复
环境: 服务器型号:infortrend ESDS-S12F-G1440: 12块单盘容量为2TB的硬盘组成raid6磁盘阵列: 阵列上有一个lun,映射到WINDOWS系统上使用: 在WINDOWS ...
- linux自动断开会话,linux – 从SSH会话断开连接是否会导致程序崩溃?
编辑2016年: 这个Q& A早于systemd v230 debacle.从systemd v230开始,新的默认设置是终止终止登录会话的所有子节点,无论采取了哪些历史上有效的预防措施来防止 ...
最新文章
- 一次性搞定权限树遍历(通用解决方案)
- mysql团队开发工具_最棒的10款MySQL GUI工具
- 正则表达式判断邮箱、身份证..是否正确
- 我们真的需要JWT吗?
- CPU8085 8086名字的由来
- mfc大观之五、六(消息机制和消息运行)
- python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
- c语言函数调用带参数,C语言函数
-C语言函数调用和参数传递
- java计费系统_Java网吧计费系统
- 本地以图搜图识图工具——嗅图狗!(python3.6实现图像比对指路,代码git)
- 抖音热门音乐整理合集歌曲打包分享
- LabWindows/CVI学习总结——前言
- RealAI:清华团队打造第三代安全可控人工智能 | 百万人学AI评选
- uni 页面加载完毕_uniapp小程序如何等待数据回来才加载页面?
- [POI 2004]ZAW
- Halcon 单目标定,畸变矫正,图像坐标系转世界坐标系
- 服装行业拼的是实力——智能制造
- 中国首届微博开发者大会杨卫华演讲
- mysql获取汉字拼音首字母_MySQL数据库获取汉字拼音的首字母函数
- Android 友盟分享 开发日记