Przypisywanie dziwnych wartości do wskaźnika na następny węzeł

Odpowiedz Nowy wątek
2020-06-29 18:06

Rejestracja: 3 lata temu

Ostatnio: 1 tydzień temu

0

Czołem. Bawię się teraz wskaźnikami w C# i za cholerę nie mogę pojąć, czemu instancja obiektu List przechowująca wskaźniki do poprzedniego i następnego węzła, po dodaniu wartości do wskaźnika węzła o nazwie Head, w mainie w instancji List wywala mi jakieś dziwne adresy w pamięci mimo że tam null pakuje. Może ktoś zna temat wskaźników w C# i pomoże :D Na kodzie łatwiej będzie zrozumieć:

namespace List
{
    unsafe public struct Node
    {
        public Node(int value, Node* prev = null, Node* next = null)
        {
            Value = value;
            PreviousNode = prev;
            NextNode = next;
        }

        public int Value;
        public Node* PreviousNode;
        public Node* NextNode;
    }

    unsafe public class List
    {
        public Node* Head;
        public Node* Tail;
        public int Count;

        public List()
        {
            Head = Tail = null;
        }

        unsafe public void Add(int value)
        {
            if (Head == null)
            {
                Node temp = new Node(value);
                Head = &temp;
            }
            else
            {
                if (Tail == null)
                {
                    *Tail = new Node(value, Head, null);
                    Head->NextNode = Tail;
                }
                else
                {
                    Node* temp = Tail;
                    *Tail = new Node(value, temp, null);
                }
            }
            Count++;
        }
    }
}
namespace ListApp
{
    class Program
    {
        unsafe static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            List.List list = new List.List();
            list.Add(1); //przy debugowaniu w klasie List tutaj jest ok, we wskaźniku jest obiekt z nullami do następnego i poprzedniego węzła
            Console.WriteLine(list.Count); /* w tym momencie list.Head->NextNode ma przypisane jakieś przypadkowe adresy w pamięci i każdy ten obiekt ma kolejny randomowy NextNode z pamięci i randomową wartość */
            Console.WriteLine(list.Head->Value); 
            Console.ReadKey();
        }
    }
}

Pozostało 580 znaków

2020-06-30 00:13
Moderator

Rejestracja: 12 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Wrocław

0

Wskaźniki w C# mają dwa zastosowania, sensowniejsze - integracja z jakimiś libkami C++, mniej sensowne - przetwarzanie bloków pamięci.
Jeśli ta firma pisze swoje własne kolekcje na wskaźnikach, to uwierz mi - i tak byś nie chciał tam pracować.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2020-06-30 10:54

Rejestracja: 2 lata temu

Ostatnio: 19 godzin temu

0

Klasy NET zawierają mnóstwo takich wskaźników i kod niezabezpieczony . Tak czy inaczej pisząc programy w C# korzystasz ze wskaźników.
Tutaj masz kody źródłowe :
https://referencesource.microsoft.com/

Pozostało 580 znaków

2020-06-30 11:23
Moderator

Rejestracja: 12 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Wrocław

1
Zimny Krawiec napisał(a):

Klasy NET zawierają mnóstwo takich wskaźników i kod niezabezpieczony . Tak czy inaczej pisząc programy w C# korzystasz ze wskaźników.

Pisząc w C# korzysta się też z uporządkowanego ruchu elektronów, ale to nie powód, aby samemu wkładać widelec do gniazdka.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2020-06-30 11:25

Rejestracja: 15 lat temu

Ostatnio: 3 minuty temu

0
Zimny Krawiec napisał(a):

Klasy NET zawierają mnóstwo takich wskaźników i kod niezabezpieczony . Tak czy inaczej pisząc programy w C# korzystasz ze wskaźników.
Tutaj masz kody źródłowe :
https://referencesource.microsoft.com/

Od kiedy implementacja biblioteki standardowej jest wzorcem do naśladowania?
Sprawdziłem LinkedListę. Nie wiem czy to jest ta standardowa implementacja, ale żadnego unsafe nie zauważyłem (a w szczególności wskaźników): https://referencesource.micro[...]ections/generic/linkedlist.cs


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2020-06-30 11:25
Ja znalazłem bardzo wiele - Zimny Krawiec 2020-06-30 12:38
np. Klasa String - Zimny Krawiec 2020-06-30 12:38
No i w String wskaźniki służą do komunikacji z natywnym kodem oraz przetwarzania bloków danych. Nie do definiowania abstrakcji. - somekind 2020-06-30 17:40

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0