C# C语言中的结构指针初始化#

C# C语言中的结构指针初始化#,c#,pointers,struct,unsafe,C#,Pointers,Struct,Unsafe,它给出的错误是对象引用未设置为对象的实例。当我想制作AVL树程序(我已经在C++中创建和测试,但是在C语言中复制时会出错)时,我怎么做? unsafe public class Temp { public struct Node { Node *left; Node *right; int value; } public Temp() { Node* T=new Node();

它给出的错误是对象引用未设置为对象的实例。当我想制作AVL树程序(我已经在C++中创建和测试,但是在C语言中复制时会出错)时,我怎么做?
unsafe public class Temp
{
    public struct Node
    {
        Node *left;
        Node *right;
        int value;
    }

    public Temp()
    {
        Node* T=new Node();
        T->left=null;
        T->right=null;
        T->value=10;
    }
}

main()
{
    Temp temp=new Temp();
}
在C#中,
newnode()
返回
Node
(它是引用),而不是
Node*
(它是指针)。 相反,您应该使用


<>无论如何,请不要复制C++,并用C++的方式来做!p> 不能将.NET变量分配给指针,只能获取指针的地址。如果不引用
new
ed
Node
它会立即被垃圾收集,因此您可能遇到了“objectreference not set”。但是,像
Node*T=new Node()
这样的表达式不应编译,因为它实际上尝试执行无效的类型转换


你想做的是错误的:不要复制和粘贴C++代码到C,这是胡说八道。如果你已经测试过,C++组件使用.NET/Nuffer-Inopp来在两个世界之间整理数据,尽管我不建议在抽象级别上这样做。如果您正在做一个练习,请仅在.NET world中实现AVL树,否则请使用具有等效功能的框架集合之一,例如

SortedSet
SortedDictionary

不要像这样尝试在C中使用指针。如果您正在移植使用指针作为引用的C++代码,那么使用引用类型。你的代码根本不起作用;“new”不在堆外分配结构,一方面,即使它分配了,指针也需要在C#中固定到位;C#是一种垃圾收集语言

简而言之,除非您完全了解C#中有关内存管理的所有知识,否则切勿使用
不安全的
。你正在关闭保护你的安全系统,因此你必须知道安全系统的作用

代码应为:

Node* T=new Node();

是什么导致了错误?我没有看到任何会出错的代码。为什么要使用
不安全的
?从C++复制代码不会让你走很远。你确定你不想要一个
类(在C#中,这意味着引用类型,它允许
null
值)而不是
struct
(在C#中,这意味着值类型,它总是按值复制,并且没有
null
)吗?我也找到了这个。然而,这并没有给出“对象引用未设置为对象实例”,而是一个无效的强制转换异常;堆栈上的地址很可能很快就会被重用
public class Temp // safe, not unsafe
{
    public class Node // class, not struct
    {
        public Node Left { get; set; } // properties, not fields
        public Node Right { get; set; } 
        public int Value { get; set; }
    }

    public Temp()
    {
        Node node = new Node();
        node.Left = null; // member access dots, not pointer-access arrows
        node.Right = null;
        node.Value = 10;
    }
}