如何在。net项目中模拟数组越界

  介绍

本篇文章给大家分享的是有关如何在。净项目中模拟数组越界,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

<强>一、(VS)项目→右击→属性→生成→(勾选)允许不安全代码

如何在。净项目中模拟数组越界

<强>二、测试代码

unsafe  private  static  void  OutOfIndexMini ()   {才能   ,,int *,小姐:=,stackalloc  int [1];      ,,我[0],=,0;   ,,//我[0],=,1;      ,,//双*,d =, stackalloc 双[1];   ,,//d [0],=, 0.01;      ,,int *, a =, stackalloc  int [3];      ,,for (;,我[0],& lt;=, 3;,我[0]+ +)   ,,{   ,,,(我[0]],=,0;      ,,,Console.WriteLine(美元“int *,小姐:=,{我[0]}“);      ,,,Console.WriteLine(美元“int *,[{我[0]}],=,{一个[我[0]]}“);   ,,}      以前,,}

<强>简单说明一下:

不安全的关键字——支持不安全代码,就是说我们可以使用指针了。

stackalloc关键字——允许向堆栈申请内存了。

下面这两句:我向内存申请了数组int[1],容量为一个整数,并同时给这个赋值为1

int *,小姐:=,stackalloc  int [1];      我[0],=,0;

接下来:我紧接着向内存申请了数组int[3],容量为3个int。

 int *, a =, stackalloc  int [3]; 

然后注意:我的的循环数组越界了我[0]& lt;=3

for (;,我[0],& lt;=, 3;,我[0]+ +)   {   [我[0]],=,0;      Console.WriteLine ($“int *,小姐:=,{我[0]}“);      Console.WriteLine ($“int *,[{我[0]}],=,{一个[我[0]]}“);   }

初始值我[0]=0,所以进入的循环

我[0]=0祝辞祝辞祝辞[我[0]]=0祝辞祝辞祝辞[0]=0

我[0]=1在祝辞祝辞[我[0]]=0祝辞祝辞祝辞[1]=0

我[0]=2祝辞祝辞祝辞[我[0]]=0祝辞祝辞祝辞[2]=0

我[0]=3祝辞祝辞祝辞[我[0]]=0祝辞祝辞祝辞[3]=0 ?

此时一个[3]对于我们平常来说已经数组越界了,但是这里仍然可以正常赋值。那这个值我们给了谁?

我们先给出一个答案:

[3]其实越界到了我[0]地盘,也就我是[3]=[0]=0,

这就造成当我[0]=3时,一个[3]越界将我[0]修改为0,程序进入死循环……

<强>三、验证

如果,我将我[0]初始值修改一下,改成1

int *,小姐:=,stackalloc  int [1];//我[0],=,0;   我[0],=,1,

那么在越界后[3]=[0]=0,打印出我来[0]=0说明数组确实越界并修改了值。

如何在。净项目中模拟数组越界

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

int *,小姐:=,stackalloc  int [1];//我[0],=,0;   我[0],=,1;      双*,d =, stackalloc 双[1];   d [0],=, 1;      int *, a =, stackalloc  int [3];

如何在。净项目中模拟数组越界

<强>四,原理分析

因为数组是相同的数据类型,连续内存。

第一次:我=0,一个[0]内存地址1000

第二次:我=1,一个[1]内存地址1004

第三次:我=2,一个[2]内存地址1008

第四次:我=3,一个[3]内存地址1012,也就是越界到了我[0]

如何在。净项目中模拟数组越界

以上就是如何在。NET项目中模拟数组越界,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

如何在。net项目中模拟数组越界