指针重置一次的方法称为第二次

时间:2019-05-17 08:26:05

标签: c# pointers ref unsafe

有人能解释一下为什么每次调用IsAMatch时头和尾都重置为null的原因,即使id传递了新的指针,旧的也被重置了。

我在c ++上有等效的脚本,并且运行良好。

有什么想法吗?
my code

这里的小代码示例显示10,20,因此第二个调用更改了第一个结构

class Program
{
    static unsafe void Main(string[] args)
    {

        MyStruct* myStruct = null;

        ChangeMe(ref myStruct, 10);

        Console.WriteLine(myStruct->num);

        MyStruct* myStruct2 = null;
        ChangeMe(ref myStruct2,20);

        Console.WriteLine(myStruct->num);

        Console.ReadKey();
    }

    public static unsafe void ChangeMe(ref MyStruct* h, int v)
    {
        MyStruct myStructNew = new MyStruct(v);

        h = &myStructNew;
    }

    public unsafe struct MyStruct
    {
        public int num;

        public MyStruct(int n)
        {
            num = n;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您基本上是在返回指向局部变量的指针,这是完全错误的。

C#php bin/magento indexer:reindex 关键字和C ++ new关键字之间存在差异,或者与C#中的newclass之间的交互有所区别。在C ++中,struct始终意味着在堆上进行分配,您需要手动对其进行分配。在C#中,对new的{​​{1}}调用意味着堆分配,但是对new的{​​{1}}调用只是初始化局部变量。

此C#代码:

class

等同于此C ++代码

new

C#struct关键字创建一个值类型,这意味着在您的情况下,它被分配在堆栈上。然后,从MyStruct myStructNew = new MyStruct(v); 返回之后,堆栈递减,从而释放局部变量。在第二次调用时,堆栈再次增加,为第二次调用分配局部变量。当您调用相同的方法时,第二个MyStruct myStructNew{v}; 将使用相同的堆栈位置。