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