You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中将byte*指针转为byte[]且不进行内存拷贝?

能否无内存拷贝将C#中的byte*转换为byte[]数组?

不可能安全地实现无拷贝转换,核心原因在于托管数组与非托管指针的内存模型完全不同:

  • byte[]是CLR托管的数组类型,其内存由垃圾回收器(GC)全权管理,数组实例包含CLR依赖的元数据(如长度、同步块索引),内存会被GC自动移动或回收。
  • byte*指向的是非托管内存(或临时固定的托管内存),这块内存不在GC的管理范畴内,无法被包装成合法的byte[]实例——强行构造会导致GC错误处理内存,引发访问异常、程序崩溃等不可预料的问题。

可行替代方案

既然你需要将数据传入要求byte[]的方法,可参考以下思路:

  • 修改目标方法参数类型:如果有权限调整目标方法,将参数从byte[]改为ReadOnlySpan<byte>或ReadOnlyMemory<byte>。此时可以直接通过new ReadOnlySpan<byte>(ptr, ptrLen)创建无拷贝的内存视图,完全满足需求,且Span/Memory是.NET Core及后续版本的原生类型,兼容性良好。
  • 接受内存拷贝(仅当无法修改方法时):若必须传入byte[],只能通过new ReadOnlySpan<byte>(ptr, ptrLen).ToArray()完成拷贝。虽然会产生内存分配,但短生命周期的数组会在GC的Gen0阶段被快速回收,通常不会造成显著性能压力。
  • 危险操作(绝对不推荐):部分非官方资料提到通过不安全代码手动修改数组内部指针字段的trick,但这种操作完全违背CLR内存模型,会导致严重的稳定性问题,禁止在生产环境使用。

内容的提问来源于stack exchange,提问作者eocron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:42:14