// never do this using System; namespace PointerStack { unsafe struct Node { public Node* Next; public void* Value; } unsafe struct PStack { public int Count; public Node* Head; } unsafe class Program { static void Main( string[] args ) { PStack* stack = stackalloc PStack[1]; Node* n1 = stackalloc Node[1]; Node* n2 = stackalloc Node[1]; Node* n3 = stackalloc Node[1]; char* a = stackalloc char[3]; char* b = stackalloc char[3]; char* c = stackalloc char[6]; // horrible!!!! for( int i = 0; i < "One".Length; i++ ) a[i] = "One"[i]; for( int i = 0; i < "Two".Length; i++ ) b[i] = "Two"[i]; for( int i = 0; i < "Three".Length; i++ ) c[i] = "Three"[i]; Console.WriteLine("Pushing"); StackPush( stack, n1, a ); StackPush( stack, n2, b ); StackPush( stack, n3, c ); Console.WriteLine( "Number of elements on stack: {0}", stack->Count ); Console.WriteLine("Popping"); char* v; while ( (v = (char*)StackPop( stack )) != null ) { Console.WriteLine( "Popped value: {0}", new string(v) ); } Console.WriteLine( "Number of elements on stack: {0}", stack->Count ); Console.Read(); } private static void* StackPop( PStack* pStack ) { if( pStack == null ) throw new ArgumentException(); if ( pStack->Count == 0 ) return null; Node* node = pStack->Head; pStack->Head = node->Next; pStack->Count--; return node->Value; } private static void StackPush( PStack* pStack, Node* node, void* value ) { if( pStack == null || node == null || value == null ) throw new ArgumentException(); node->Value = value; if( pStack->Head != null ) node->Next = pStack->Head; pStack->Head = node; pStack->Count++; } } }