Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#结构指针中返回的地址相同_C#_Pointers_Struct - Fatal编程技术网

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之前,我也被愚弄了一段时间。它不在堆上,而是在本地堆栈上。