热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:获取指向字节数组的指针的不安全方法分享

获取指向字节数组的指针的不安全方法这种行为在C#中是否有效publicclassMyClass{privatebyte[]data;publicMyClass(){this.dat

获取指向字节数组的指针的不安全方法

这种行为在C#中是否有效

public class MyClass { private byte[] data; public MyClass() { this.data = new byte[1024]; } public unsafe byte* getData() { byte* result = null; fixed (byte* dataPtr = data) { result = dataPtr; } return result; } } 

如果您要关闭安全系统,那么您有责任确保程序的内存安全 。 一旦你这样做, 你需要安全地做所有事情,而安全系统不会帮助你 。 这就是“不安全”的含义。

正如C#规范明确指出:

只能使用固定语句获取可移动变量的地址,并且该地址仅在该固定语句的持续时间内有效。

您正在获取可移动变量的地址,然后在固定语句的持续时间之后使用它,因此该地址不再有效 。 因此,特别要求您不要正确地做您正在做的事情

在深入了解必须遵循的规则之前,不应编写任何不安全的代码。 首先阅读规范第18章的全部内容。

这段代码编译得很好但会导致运行时问题。 代码基本上是走私指向堆中未固定对象的指针。 移动MyClass类型的下一个GC也将使用它移动data引用,并且任何先前从getData返回的值现在将指向错误的位置。

 var obj = new MyClass(); unsafe byte* pValue = obj.getData(); // Assuming no GC has happened (bad assumption) then this works fine *pValue = 42; // Assume a GC has now happened and `obj` moved around in the heap. The // following code is now over writing memory it simply doesn't own *pValue = 42; 

最后一行是否会导致应用程序崩溃,覆盖另一种类型的string值,或者只是将一个值戳入未初始化的数组中,然后搞砸了数学问题呢? 你不知道。 最好的结果是代码只是快速崩溃,但在所有可能的情况下它会做一些更微妙和邪恶的事情。

您可以使用Marshal.StructureToPtr()方法而不是不安全的魔法:)

StructureToPtrStructureToPtr的内容复制到ptr参数指向的预分配内存块。

Marshal.StructureToPtr方法(对象,IntPtr,布尔)

这段代码不起作用(它会编译但在运行时会导致问题)。 固定区域结束后,数据不再固定。

不,一旦离开fixed块, result的值就不再有效(如果GC没有运行,它可能同时有效)。

执行此类操作的正确方法是在非托管内存中引用可通过C#代码访问的byte[] ,或将托管数组复制到非托管内存中。

上述就是C#学习教程:获取指向字节数组的指针的不安全方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
author-avatar
尹琢抵
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有