.NET 下 模拟数组越界
前面一篇文章提到过 数组越界行为,虽然编译器为我们做了大量的检查工作让我们避免这些错误。
但是我觉得还是有必要模拟一下数组越界,感受一下这个错误。
那么对于.NET来说我们怎么来模拟数组越界呢?
一、 [VS] 项目 -> 右击 -> 属性 -> 生成 -> (勾选)允许不安全代码

二、测试代码
unsafe private static void OutOfIndexMini()
{
int* i = stackalloc int[]; i[] = ;
//i[0] = 1; //double* d = stackalloc double[1];
//d[0] = 0.01; int* a = stackalloc int[]; for (; i[] <= ; i[]++)
{
a[i[]] = ; Console.WriteLine($"int* i = {i[0]}"); Console.WriteLine($"int* a[{i[0]}] = {a[i[0]]}");
} }
简单说明一下:
unsafe 关键字 -- 支持不安全代码,就是说我们可以使用指针了。
stackalloc 关键字 -- 允许向堆栈申请内存了。
下面这两句:我向内存申请 了数组 int[1],容量为一个int,并同时给这个赋值为1
int* i = stackalloc int[]; i[] = 0;
接下来:我紧接着向内存申请了数组 int[3],容量为 3个int.
int* a = stackalloc int[];
然后注意:我的for循环数组越界了 i[0] <= 3
for (; i[] <= ; i[]++)
{
a[i[]] = ; Console.WriteLine($"int* i = {i[0]}"); Console.WriteLine($"int* a[{i[0]}] = {a[i[0]]}");
}
初始值 i[ 0 ] = 0,所以进入for循环
i[0] = 0 >>> a[ i[ 0 ] ] =0 >>> a[ 0 ] =0
i[0] = 1 >>> a[ i[ 0 ] ] =0 >>> a[ 1 ] =0
i[0] = 2 >>> a[ i[ 0 ] ] =0 >>> a[ 2 ] =0
i[0] = 3 >>> a[ i[ 0 ] ] =0 >>> a[ 3 ] =0 ?
此时 a[ 3 ] 对于我们平常来说已经数组越界了,但是这里仍然可以正常赋值。那这个值我们给了谁?
我们先给出一个答案:
a[3] 其实越界到了 i[0] 地盘,也就是 a[3] = i[0] = 0,
这就造成 当 i[0] = 3 时,a[3] 越界将 i[0] 修改为0,程序进入死循环 ... ...
三、验证
如果,我将 i[0] 初始值修改一下,改成1
int* i = stackalloc int[]; //i[0] = 0;
i[] = ;
那么在越界后 a[3] = i[0] = 0 ,打印出来 i [0] = 0 说明数组确实越界并修改了值。

那么,我在中间再声明一个不是int类型的数组,导致越界不是修改的 i[0] 这样就不会死循环了。
int* i = stackalloc int[]; //i[0] = 0;
i[] = ; double* d = stackalloc double[];
d[] = ; int* a = stackalloc int[];

四、原理分析
因为数组是相同的数据类型,连续内存。
第一次:i=0 ,a[0] 内存地址 1000
第二次:i=1 ,a[1] 内存地址 1004
第三次:i=2 ,a[2] 内存地址 1008
第四次:i=3 ,a[3] 内存地址 1012,也就是越界到了 i[0]

.NET 下 模拟数组越界的更多相关文章
- Objective-c防止数组越界而崩溃(全局效果)
数组越界其实是很基本的问题,但是解决起来除了count的判断,还有每个调用的时候都要去判断一遍 对于不明确的数据总会有崩溃的风险 然而 每次调用都判断 那是太累了 so ..runtime&c ...
- 解决Android时时更新listview数组越界问题
时时更新数据一般出现在金融.股票行业对数据的准确性要求极高情况下使用. 先来看看下面一段代码, public class MainActivity extends Activity { private ...
- 操作系统->数组越界(待完善)
工作中无意间发现了一段可能存在数组越界的代码, 就在本地仿者写了一段越界的小程序, 先记录下,待以后看操作系统知识的时候,再深入分析 #include <stdio.h> #include ...
- 墨菲定律与 IndexOutOfBoundsException(数组越界异常)
今天维护又反馈了一问题过来,查询试卷时报数组越界异常: 2017-02-28 10:45:24,827[ERROR] HttpException[10.32.111.7:60446:2D07867BE ...
- iOS数组越界
数组越界就是假如你的下标总数现在为32个,然后你在下一秒又执行了一个方法要从50个数据里进行赋值啊筛选之类的,而你此时数组里的值为32个,50的数据还没有请求到,往往会出现数组越界的崩溃信息,大概是这 ...
- ListView 适配器实现getviewtypcount() 数组越界IndexOutOfBoundException
ListView中Item的多布局显示,需要用到了getViewTypecount和getItemViewType这两个重写方法,但是做完后出现了如下提示错误:java.lang.ArrayIndex ...
- 使用EasyPOI导入导出图片出现数组越界异常
在我使用easypoi做导出功能的时候,突然抛了一个数组越界异常,找了很久也没找到,最后猜想有可能是路径出了问题,然后打印了一下图片存放的路径,结果发现在其保存路径上存在“.”,也就是easypoi底 ...
- Program terminated with signal 6, Aborted. (最后发现是数组越界导致)
外网崩溃现象: 1.多台物理机中的多个进程消失,而且都是场景进程. 2.core文件都很小,看了 ulimit -a 和 cat proc/pid/limits (都很正常.看这个是为了以后core ...
- ListView 适配器实现getviewtypecount() 数组越界IndexOutOfBoundException
ListView中Item的多布局显示,需要用到了getviewtypecount和getItemViewType这两个重写方法,但是做完后出现了如下提示错误: java.lang.ArrayInde ...
随机推荐
- Flask开发微电影网站(三)
页面完成后的最终布局 可以看到,页面共同的部分是顶部导航和底部导航 所以我们可以把页面顶部导航和底部导航部分单独定义一个文件home.html,然后让需要使用顶部导航和底部导航的页面都继承home.h ...
- BZOJ_2427_[HAOI2010]软件安装_tarjan+树形DP
BZOJ_2427_[HAOI2010]软件安装_tarjan+树形DP 题意: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁 ...
- BZOJ_4196_[Noi2015]软件包管理器_树链剖分
BZOJ_4196_[Noi2015]软件包管理器_树链剖分 题意: Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助 ...
- 阿里巴巴Java开发程序猿年薪40W是什么水平?
对于年薪40万的程序员,不只是技术过硬,还有一个原因是他们所在的公司福利高,或者会直接持股.在BAT中就是一个很好的案例,例如阿里巴巴P7,P8级别的员工不仅是年薪30到80万不等,还有更多股票持有. ...
- Https协议与HttpClient的实现
一.背景 HTTP是一个传输内容有可读性的公开协议,客户端与服务器端的数据完全通过明文传输.在这个背景之下,整个依赖于Http协议的互联网数据都是透明的,这带来了很大的数据安全隐患.想要解决这个问题有 ...
- Linux - 修改系统的max open files、max user processes (附ulimit的使用方法)
目录 1 问题说明 2 修改max open files 3 修改max user processes 4 附录: ulimit命令说明 1 问题说明 Linux 系统默认的max open file ...
- vue项目使用websocket技术
一.为什么需要websocket? 前端和后端的交互模式最常见的就是前端发数据请求,从后端拿到数据后展示到页面中.如果前端不做操作,后端不能主动向前端推送数据,这也是http协议的缺陷. 因此,一种新 ...
- angular开发环境搭建及新建项目
最近一个星期准备学习一下angular前端框架,因为之前在学习abp框架的时候,都要求前端要掌握angular,所以不得不回来恶补一下了,学习的过程有时间的话会记录在这里,方便以后复习. 闲言少叙,下 ...
- MVC图片上传详解
MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFileBase shangch ...
- ajax请求window.open()被拦截
项目使用ajax post后根据返回的success,需要打开一个新页面,使用window.open发现谷歌浏览器直接被拦截. 后来了解发现该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了, ...