C#结构指针中返回的地址相同
我创建了一个结构指针,但是对新节点的每次调用都返回相同的地址。但我希望每次调用新节点都会返回不同的地址。有人能帮忙吗C#结构指针中返回的地址相同,c#,pointers,struct,C#,Pointers,Struct,我创建了一个结构指针,但是对新节点的每次调用都返回相同的地址。但我希望每次调用新节点都会返回不同的地址。有人能帮忙吗 public unsafe struct Node { public int Data; } class TestPointer { public unsafe Node* getNode(int i) { Node n = new Node(); n.Data = i; Node* ptr = &n
public unsafe struct Node
{
public int Data;
}
class TestPointer
{
public unsafe Node* getNode(int i)
{
Node n = new Node();
n.Data = i;
Node* ptr = &n;
return ptr;
}
public unsafe static void Main(String[] args)
{
TestPointer test = new TestPointer();
Node* ptr1 = test.getNode(1);
Node* ptr2 = test.getNode(2);
if (ptr1->Data == ptr2->Data)
{
throw new Exception("Why?");
}
}
}
n
正在收集垃圾吗?不要被节点n=new Node()愚弄代码>语法<代码>节点
作为一个结构,在堆栈上分配n
。在同一个环境中,从同一个函数调用两次getNode
,因此自然会得到指向同一堆栈位置的两个指针。此外,一旦getNode
返回,这些指针就变得无效(“悬空”),因为属于n
的堆栈位置可能会被其他调用覆盖。简言之:不要这样做。如果您希望CLR分配内存,请将节点
设为类。实际上,我的坏。我看错了OP的帖子。我以为他是在返回节点本身,而不仅仅是指针。我取消了我的反对票,但同时还有其他人投了票…@Mike Oh。对不起。顺便说一句,如果他返回了节点本身,它通常不会进入堆,而是进入调用方分配的堆栈空间。回答得好!如果您使用ildasm查看生成的代码,您会发现从来没有分配过堆对象,而n只是本地的:“.locals init([0]valuetype ConsoleApplication2.Program/Node n,…”这段代码几乎是悬空指针的经典示例。但是“new”在我看IL-Code.Nope之前,我也被愚弄了一段时间。它不在堆上,而是在本地堆栈上。