最近我写了一些树,想尝试不安全的代码。最后,我做的都没有不安全,但在这段代码中找到了一些模糊(对我而言)的地方(对于更短的代码,我删除了所有逻辑,因此所有代码看起来都毫无意义):
public static void Main() {
EqClass a = new EqClass();
a.AddElement(2, new record(3)); // *place1*
...
}
unsafe struct node {
public node* next;
public record Value;
public node(record value) {
this = new node();
this.Value = value;
}
}
struct record {
public int a;
public record(int a) {
this.a = a;
}
}
unsafe class EqClass {
node*[] last = new node*[3];
public void AddElement(int classIndex, record element) {
node a = new node(element);
node* newNode = &a;
last[classIndex]->next = newNode; // *place2*
}
}
在 place2 中一切都可以,但是当方法AddElement
结束时,在最后[2](放置元素的地方)意外地出现了一些垃圾。但为什么?提前谢谢。
答案 0 :(得分:6)
这是不 unsafe
和*
的用途。说真的:不要这样做。你在这里做的基本上是参考。为此:使用class
,而不是struct
。否则这对你非常非常伤害。
另外:这不是struct
的用途。看一下像这样的可变struct
在瞬间告诉我你并不欣赏struct
打算做什么。
如果您想知道无意义值的来源:指针不是固定位置。对此的解决不是“哦,所以我需要固定它们”。它是“使用引用,而不是指针”。