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

 更新时间:2019年01月13日 09:19:06   作者:K战神  
这篇文章主要给大家介绍了关于.NET下模拟数组越界的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

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

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

那么对于.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]

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • ASP.NET Core扩展库之Http通用扩展库的使用详解

    ASP.NET Core扩展库之Http通用扩展库的使用详解

    这篇文章主要介绍了ASP.NET Core扩展库之Http通用扩展库的使用详解,帮助大家更好的理解和学习使用.net技术,感兴趣的朋友可以了解下
    2021-04-04
  • .NET中应用程序内共享UdpClient联机的实现方法

    .NET中应用程序内共享UdpClient联机的实现方法

    本篇文章介绍了,.NET中应用程序内共享UdpClient联机的实现方法。需要的朋友参考下
    2013-05-05
  • 十分钟搞定多图片/文件服务器

    十分钟搞定多图片/文件服务器

    图片/文件服务器,顾名思义就是存文件呗,有的人用阿里云的现有服务,有的把文件Post到文件服务器,在文件服务器一端用一个应用程序来接收并保存,方法各不相同。下面跟着小编一起来看下吧
    2017-01-01
  • 子窗口给父窗口赋值实现思路及案例演示

    子窗口给父窗口赋值实现思路及案例演示

    今天学习一下javascript实现从父窗口打开一个子窗口,在子窗口处理一些结果之后,把结果赋值于父窗口的文本框内,接下来介绍实现方法,感兴趣的朋友可以了解下,希望本文对你有所帮助
    2013-01-01
  • .net core如何在网络高并发下提高JSON的处理效率详解

    .net core如何在网络高并发下提高JSON的处理效率详解

    这篇文章主要给大家介绍了关于.net core如何在网络高并发下提高JSON的处理效率的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用.net core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • asp.net中使用log4net详解

    asp.net中使用log4net详解

    本文详细讲解了在asp.net中使用log4net的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 从ASP.NET Core3.1迁移到5.0的方法

    从ASP.NET Core3.1迁移到5.0的方法

    这篇文章主要介绍了从ASP.NET Core3.1迁移到5.0的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 基于.Net的单点登录(SSO)实现解决方案

    基于.Net的单点登录(SSO)实现解决方案

    SSO的解决方案很多,但搜索结果令人大失所望,大部分是相互转载,并且描述的也是走马观花,本文对此进行详细介绍,需要了解的朋友可以参考下
    2012-11-11
  • ajax添加数据后如何在网页显示

    ajax添加数据后如何在网页显示

    这篇文章主要介绍了ajax添加数据显示在网页上,此文是通过ajax获取后台json数据来实现此功能,需要的朋友可以参考下
    2015-07-07
  • asp.net中绑定TextBox回车事件的解决方法

    asp.net中绑定TextBox回车事件的解决方法

    asp.net中绑定TextBox回车事件的解决方法,需要的朋友可以参考下。
    2011-07-07

最新评论