前面一篇文章提到过 数组越界行为,虽然编译器为我们做了大量的检查工作让我们避免这些错误。

但是我觉得还是有必要模拟一下数组越界,感受一下这个错误。

那么对于.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 下 模拟数组越界的更多相关文章

  1. Objective-c防止数组越界而崩溃(全局效果)

    数组越界其实是很基本的问题,但是解决起来除了count的判断,还有每个调用的时候都要去判断一遍 对于不明确的数据总会有崩溃的风险 然而 每次调用都判断 那是太累了 so ..runtime&c ...

  2. 解决Android时时更新listview数组越界问题

    时时更新数据一般出现在金融.股票行业对数据的准确性要求极高情况下使用. 先来看看下面一段代码, public class MainActivity extends Activity { private ...

  3. 操作系统->数组越界(待完善)

    工作中无意间发现了一段可能存在数组越界的代码, 就在本地仿者写了一段越界的小程序, 先记录下,待以后看操作系统知识的时候,再深入分析 #include <stdio.h> #include ...

  4. 墨菲定律与 IndexOutOfBoundsException(数组越界异常)

    今天维护又反馈了一问题过来,查询试卷时报数组越界异常: 2017-02-28 10:45:24,827[ERROR] HttpException[10.32.111.7:60446:2D07867BE ...

  5. iOS数组越界

    数组越界就是假如你的下标总数现在为32个,然后你在下一秒又执行了一个方法要从50个数据里进行赋值啊筛选之类的,而你此时数组里的值为32个,50的数据还没有请求到,往往会出现数组越界的崩溃信息,大概是这 ...

  6. ListView 适配器实现getviewtypcount() 数组越界IndexOutOfBoundException

    ListView中Item的多布局显示,需要用到了getViewTypecount和getItemViewType这两个重写方法,但是做完后出现了如下提示错误:java.lang.ArrayIndex ...

  7. 使用EasyPOI导入导出图片出现数组越界异常

    在我使用easypoi做导出功能的时候,突然抛了一个数组越界异常,找了很久也没找到,最后猜想有可能是路径出了问题,然后打印了一下图片存放的路径,结果发现在其保存路径上存在“.”,也就是easypoi底 ...

  8. Program terminated with signal 6, Aborted. (最后发现是数组越界导致)

    外网崩溃现象: 1.多台物理机中的多个进程消失,而且都是场景进程. 2.core文件都很小,看了 ulimit -a 和 cat proc/pid/limits  (都很正常.看这个是为了以后core ...

  9. ListView 适配器实现getviewtypecount() 数组越界IndexOutOfBoundException

    ListView中Item的多布局显示,需要用到了getviewtypecount和getItemViewType这两个重写方法,但是做完后出现了如下提示错误: java.lang.ArrayInde ...

随机推荐

  1. tkiner中Radiobutton单选框控件(七)

    Radiobutton控件 由于本次内容中好多知识都是之前重复解释过的,本次就不做解释了.不太清楚的内容请参考tkinter1-6节中的内容 import tkinter wuya = tkinter ...

  2. volume_manager.go

    package ) type) ],,) ,)             vms.CanCreateVolume = false         } else {             vms.Can ...

  3. 【BZOJ】1969: [Ahoi2005]LANE 航线规划

    题目链接: 传送~~ 题解:  老夫实在是码不动了…… 正着搞显然不好做,尝试倒着乱搞.先给被删除的边标记一个时间戳,先删除的时间戳大,同时维护询问时间戳,询问早的时间戳大.没被删除过的边时间戳都是0 ...

  4. BZOJ_2882_工艺_后缀数组

    BZOJ_2882_工艺_后缀数组 Description 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且 ...

  5. BZOJ_3238_[Ahoi2013]差异_后缀自动机

    BZOJ_3238_[Ahoi2013]差异_后缀自动机 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sam ...

  6. mysql中利用group by过滤删除重复行

    DELETEFROM peopleWHERE peopleId IN (SELECT peopleId FROM people GROUP BY peopleId HAVING count(peopl ...

  7. 再不了解PostgreSQL,你就晚了之PostgreSQL主从流复制部署

    前言 在MySQL被收购之后,虽然有其替代品为: MariaDB,但是总感觉心里有点膈应.大家发现了另一款开源的数据库: PostgreSQL. 虽然centos自带版本9.2也可以用,但是最近的几次 ...

  8. MySQL - 高可用性:少宕机即高可用?

    我们之前了解了复制.扩展性,接下来就让我们来了解可用性.归根到底,高可用性就意味着 "更少的宕机时间". 老规矩,讨论一个名词,首先要给它下个定义,那么什么是可用性? 1 什么是可 ...

  9. ABP学习笔记(1)-使用mysql

    前言 开始学习ABP啦 下载官方模板 ​ 下载地址: https://aspnetboilerplate.com/Templates ​ 我这边选择的是.NET Core+VUE 移除SqlServe ...

  10. 前端笔记之ES678&Webpack&Babel(上)初识ES678&Babel&let和const&解构&语法

    一.ES版本简介和调试运行方法 1.1 ECMAScript简介 MDN手册:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript JavaS ...