Как вывести указатель на вершину стека?

Не могу вывести указатель на вершину стека

    class Stack
{
    public int value;
    public Stack next;
}
class Program
{

    static void Main()
    {
        Stack head = null;
        Stack current = null;
        int count = 0;
        int size = 10;
        int[] N = new int[size];
        for (int i = 0; i < size; i++)
        {
            N[i] = size - i;
            current = new Stack();

            current.value = N[i];
            current.next = head;
            head = current;
            count++;
        }

        Console.WriteLine($"There are {count} elements are available at the stack");
        current = head;
        while (current != null)
        {
            Console.WriteLine(current.value);
            current = current.next;
        }
        Console.ReadLine();
        Console.Write("{0:X}", head);
    }
}

Должно выводиться такое, но у меня почему-то не выводится

введите сюда описание изображения

Вот что выводиться у меня:

введите сюда описание изображения


Ответы (2 шт):

Автор решения: Aziz Umarov

Так попробуйте

class Stack
{
    public int value;
    public Stack next;
}
class Program
{

    static void Main()
    {
        Stack first = null;

        Stack current = null;
        Stack prev = null;
        int count = 0;
        int size = 10;
        int[] N = new int[size];
        for (int i = 0; i < size; i++)
        {
            N[i] = size - i;
            current = new Stack();
            if (first == null) {
                first = current;
            }
            current.value = N[i];
            if (prev != null) {
                prev.next = current;
            }
            prev = current;
            count++;
        }

        Console.WriteLine($"There are {count} elements are available at the stack");
        current = first;
        while (current != null)
        {
            Console.WriteLine(current.value);
            current = current.next;
        }
        //Console.ReadLine();
        Console.Write("{0:X}", first.value);
    }
}
→ Ссылка
Автор решения: Andrei Khotko

Внимание! C# по умолчанию предполагает то, что с ним нужно работать в безопасном режиме (CLR гарантирует безопасный доступ к памяти). Поэтому следует понимать, что в C# не принято говорить терминами С++ указатель, адрес, ссылка и т.п.


Судя по консольному выводу, который вы ожидаете, кусок кода был взят из C/C++ и перенесен на C#.

В C# чтобы получить адрес объекта, нужно настроить сборку проекта, разрешив небезопасный код (правой клавишей по проекту -> Properties -> Build -> Поставить галочку напротив пункта Allow unsafe code), после чего можно сделать что-то подобное:

internal static class Program
{
    public static unsafe void Main()
    {
        Stack head = null;

        //... Ваш код по созданию стека без изменений.
        
        var headRef = __makeref(head);
        var headAddress = **(IntPtr**)(&headRef);

        Console.WriteLine(headAddress.ToString("x"));

        // Пример вывода: 1d03d95b7b0
    }
}
→ Ссылка