数码控科技猎奇Iphone动漫星座游戏电竞lolcosplay王者荣耀攻略allcnewsBLOGNEWSBLOGASKBLOGBLOGZSK全部技术问答问答技术问答it问答代码软件新闻开发博客电脑/网络手机/数码笔记本电脑互联网操作系统软件硬件编程开发360产品资源分享电脑知识文档中心IT全部全部分类全部分类技术牛文全部分类教程最新网页制作cms教程平面设计媒体动画操作系统网站运营网络安全服务器教程数据库工具网络安全软件教学vbscript正则表达式javascript批处理更多»编程更新教程更新游戏更新allitnewsJava新闻网络医疗信息化安全创业站长电商科技访谈域名会议专栏创业动态融资创投创业学院 / 产品经理创业公司人物访谈营销开发数据库服务器系统虚拟化云计算嵌入式移动开发作业作业1常见软件all电脑网络手机数码生活游戏体育运动明星影音休闲爱好文化艺术社会民生教育科学医疗健康金融管理情感社交地区其他电脑互联网软件硬件编程开发360相关产品手机平板其他电子产品摄影器材360硬件通讯智能设备购物时尚生活常识美容塑身服装服饰出行旅游交通汽车购房置业家居装修美食烹饪单机电脑游戏网页游戏电视游戏桌游棋牌游戏手机游戏小游戏掌机游戏客户端游戏集体游戏其他游戏体育赛事篮球足球其他运动球类运动赛车健身运动运动用品影视娱乐人物音乐动漫摄影摄像收藏宠物幽默搞笑起名花鸟鱼虫茶艺彩票星座占卜书画美术舞蹈小说图书器乐声乐小品相声戏剧戏曲手工艺品历史话题时事政治就业职场军事国防节日风俗法律法规宗教礼仪礼节自然灾害360维权社会人物升学入学人文社科外语资格考试公务员留学出国家庭教育学习方法语文物理生物工程学农业数学化学健康知识心理健康孕育早教内科外科妇产科儿科皮肤科五官科男科整形中医药品传染科其他疾病医院两性肿瘤科创业投资企业管理财务税务银行股票金融理财基金债券保险贸易商务文书国民经济爱情婚姻家庭烦恼北京上海重庆天津黑龙江吉林辽宁河北内蒙古山西陕西宁夏甘肃青海新疆西藏四川贵州云南河南湖北湖南山东江苏浙江安徽江西福建广东广西海南香港澳门台湾海外地区

.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 字符串、二进制、编码数组转换函数
  • asp.net 判断数组是否存在某个值的方法
  • asp.net(c#) 使用rex正则来生成字符串数组的代码
  • asp.net通过js实现cookie创建以及清除cookie数组的代码
  • asp.net 数组中字符串替换的几种方式
  • vb.net 数组参与sql语句的查询范例
  • asp.net数组删除重复值实现代码
  • asp.net mvc数组模型绑定详解
  • .net数组使用中的注意事项小结
  • asp.net动态生成html页面的方法分享
  • asp.net中gridview的查询、分页、编辑更新、删除的实例代码
  • asp.net 页面之间传递参数的几种方法
  • asp.net repeater添加序号列的方法
  • asp.net无法加载oci.dll等错误的解决方法
  • vs2015 免费插件refactoring essentials
  • asp.net中md5 16位和32位加密函数
  • asp.net mvc异步获取和刷新extjs6 treestore
  • c# setwindowpos窗口置顶使用说明
  • asp.net dropdownlist 三级联动下拉菜单实现代码
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved