如何解决如何获取指向Array实例的内存的指针?
网络上有许多示例如何获取指向byte[]
或int[,]
的指针,即当您确切知道数组的元素类型和等级时。但是如何获取通用Array
的指针?
这里的主要问题是我不知道提前排名。我也不知道元素类型,但我知道只能有原始数字类型,因此我可以输入一些额外的if
来解决它。
背景:我想使此解决方案https://stackoverflow.com/a/52750659/6734314更通用-以当前形式,它仅适用于double[,]
,因此给出了经典的rank +类型:
double[,] doubles = {
{ 1,2,3,4 },...
};
fixed (double* p = doubles)
{
...
首次尝试
从奥利维尔的答案来看,所有错误都是我的。
Array data = new float[,] { { 4,2 },{ 77,3 } };
var reference = __makeref(data);
IntPtr pointer = **(IntPtr**)(&reference);
float* ptr = (float*)pointer.ToPointer();
{
for (int i = 0; i < data.LongLength; ++i)
Console.WriteLine(ptr[i]);
}
解决方法
组合:
Memory address of an object in C#
和
How can I display a pointer address in C#?
写作:
.map()
输出:
Array array = Array.CreateInstance(typeof(int),10);
unsafe
{
var reference = __makeref(array);
var pointer = **(IntPtr**)( &reference );
Console.WriteLine("0x{0:x}",(ulong)&reference);
Console.WriteLine("0x{0:x}",(long)&reference);
Console.WriteLine("0x{0:x}",(ulong)pointer);
Console.WriteLine("0x{0:x}",(long)pointer);
}
,
如果数据始终是相同的形状(例如2D矩形阵列),但可能具有不同的 types ,那么您可以使用T : unmanaged
约束和fixed
关键字:
static void Main()
{
// sample taken from comtrade91.pdf section 6.6
var data = new float[,] { { 4,2 },{ 77,3 } };
ShowAddressAndData(data);
}
static unsafe void ShowAddressAndData<T>(T[,] data) where T : unmanaged
{
fixed(T* ptr = data)
{
Console.WriteLine((IntPtr)ptr);
for (int i = 0; i < data.Length; i++)
{
Console.WriteLine(ptr[i]);
}
}
}
// this extra method just to show that we can overload on dimension
static unsafe void ShowAddressAndData<T>(T[] data) where T : unmanaged
{
fixed (T* ptr = data)
{
Console.WriteLine((IntPtr)ptr);
//..
}
}
,
我认为我找到了它,如果您发现某些东西太脆弱/可疑,请发表评论:
Array data = new float[,3 } };
GCHandle handle = GCHandle.Alloc(data,GCHandleType.Pinned);
try
{
IntPtr address = handle.AddrOfPinnedObject();
float* ptr = (float*)address.ToPointer();
for (int i = 0; i < data.LongLength; ++i)
Console.WriteLine(ptr[i]);
}
finally
{
handle.Free();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。