Пытаюсь реализовать стек с использованием указателей. Пробовал сделать так (пока набросок):
Node* head;
unsafe struct Node
{
public Int32 Value;
public Node* Next;
}
public LinkedStack()
{
head = null;
}
public void Add(Int32 value)
{
// Создаётся новый элемент стека, который ссылается на предыдущую "голову"
Node newNode = new Node();
newNode.Next = head;
newNode.Value = value;
head = &newNode;
}
public Int32 Peek()
{
return head->Value;
}
При этом любое обращение к head->Value вне блока Add (к примеру в блоке Peek()) возвращает семизначные и более числа, которые не были занесены в стек.
Но при вынесении переменной newNode в переменные класса следующим образом и обращение к ней используя fixed работает нормально и возвращает корректные значения:
Node* head;
Node newNode;
unsafe struct Node
{
public Int32 Value;
public Node* Next;
}
public LinkedStack()
{
head = null;
}
public void Add(Int32 value)
{
fixed (Node* pNewNode = &newNode) // Необходимый костыль
{
pNewNode->Next = head;
pNewNode->Value = value;
// Меняем указатель головы на новый элемент
head = pNewNode;
}
}
public Int32 Peek()
{
return head->Value;
}
Не могу понять в чём проблема. Почему после окончания блока Add значение Value меняется на произвольное другое? А при использовании fixed значение хранится нормально.