如何在C#中获取指针地址的值?

3

我创建了一个指针并将其存储在本地哈希映射中,但是当获取值时,如何将其转换回我的结构体?

我是这样创建它的:

T* p = &myStruct;
hashMap.Add(myStruct, (int)p); //<MyStruct,int>

现在回头看,我正在试图做的是:

if(hashMap.TryGetValue(item, out int ptr)){

    T myStruct = *ptr; // don't know the right syntax here

    Debug.Log(myStruct.Equals(item)); // should be the same
}

我不能使用 IntPtr ,因为我不能使用 Marshal.PtrToStructure 。Unity的编译器不允许它在其线程中使用。


如果你在64位模式下运行程序,使用int类型来存储指针数值是行不通的。 - adv12
2个回答

3

你已经接近了答案,但是你得到的 int ptr 仍然是一个 int 地址,而不是一个指针!

我认为你正在寻找的可能是以下内容:

 T myStruct = *((T*)ptr);

首先将地址转换回指针,然后对其进行解引用。

括号是多余的,只是为了更容易理解。你也可以直接这样做:

T myStruct = *(T*)ptr;

或分步骤进行

if(hashMap.TryGetValue(item, out int addr))
{
    T* ptr = (T*)addr;
    T myStruct = *ptr;

    Debug.Log(myStruct.Equals(item));
}

0

我只是想在这里补充一下,如果您在编译设置中勾选了“允许不安全代码”选项,我认为您可以使用 Marshal.PtrToStructure。前往:

编辑 > 项目设置 > 玩家 > 其他设置 > 脚本编译 > “允许‘不安全’代码”

enter image description here


我已经启用了不安全代码,但你不能在Unity的Burst编译器中使用Marshal。 - WDUK
如果没有这个,那么OP在第一次使用指针时也不会被允许使用 ;) - derHugo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接