最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

.NET下模拟数组越界的方法详解

来源:懂视网 责编:小采 时间:2020-11-27 22:34:43
文档

.NET下模拟数组越界的方法详解

.NET下模拟数组越界的方法详解:前言 前面一篇文章提到过 数组越界行为,虽然编译器为我们做了大量的检查工作让我们避免这些错误。 但是我觉得还是有必要模拟一下数组越界,感受一下这个错误。 那么对于.NET来说我们怎么来模拟数组越界呢? 一、 [VS] 项目 -> 右击 -> 属性 -
推荐度:
导读.NET下模拟数组越界的方法详解:前言 前面一篇文章提到过 数组越界行为,虽然编译器为我们做了大量的检查工作让我们避免这些错误。 但是我觉得还是有必要模拟一下数组越界,感受一下这个错误。 那么对于.NET来说我们怎么来模拟数组越界呢? 一、 [VS] 项目 -> 右击 -> 属性 -

前言

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

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

那么对于.NET来说我们怎么来模拟数组越界呢?

一、 [VS] 项目 -> 右击 -> 属性 -> 生成 -> (勾选)允许不安全代码

二、测试代码

unsafe private static void OutOfIndexMini()
 {
 int* i = stackalloc int[1];

 i[0] = 0;
 //i[0] = 1;

 //double* d = stackalloc double[1];
 //d[0] = 0.01;

 int* a = stackalloc int[3];

 for (; i[0] <= 3; i[0]++)
 {
 a[i[0]] = 0;

 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[1];

i[0] = 0;

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

int* a = stackalloc int[3];

然后注意:我的for循环数组越界了i[0] <= 3

for (; i[0] <= 3; i[0]++)
{
  a[i[0]] = 0;

  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[1];

//i[0] = 0;
i[0] = 1; 

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

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

int* i = stackalloc int[1];

//i[0] = 0;
i[0] = 1;

double* d = stackalloc double[1];
d[0] = 1;

int* a = stackalloc int[3];

四、原理分析

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

第一次:i=0 ,a[0] 内存地址 1000

第二次:i=1 ,a[1] 内存地址 1004

第三次:i=2 ,a[2] 内存地址 1008

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

总结

文档

.NET下模拟数组越界的方法详解

.NET下模拟数组越界的方法详解:前言 前面一篇文章提到过 数组越界行为,虽然编译器为我们做了大量的检查工作让我们避免这些错误。 但是我觉得还是有必要模拟一下数组越界,感受一下这个错误。 那么对于.NET来说我们怎么来模拟数组越界呢? 一、 [VS] 项目 -> 右击 -> 属性 -
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top