C# C语言中的结构指针初始化#
它给出的错误是对象引用未设置为对象的实例。当我想制作AVL树程序(我已经在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();
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
edNode
它会立即被垃圾收集,因此您可能遇到了“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;
}
}