Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Frage zur verwendung von Zeigern bei dynamischen Speichern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.02.2014, 17:12 Uhr
ccputer



Es geht um dieses Programm das eine verkettete Liste darstellen soll:

C++:
#include <iostream>
using namespace std;

struct TListenKnoten
{
    int data;            // simuliert die Daten
    TListenKnoten *next; // Verknüpfung zum Nachfolger
};

TListenKnoten *Anker = 0; // Anfang der Liste

int main()
{
    int Inhalt;
    TListenKnoten *node, *old;
    // Fülle die Liste mit Zahlen, bis 0 eingegeben wird
    do
    {
        cout << "Zahl eingeben (0 für Ende)" << endl;
        cin >> Inhalt;
        if (Inhalt)
        {
                     // Neues Element für die Liste erzeugen:
Zeile x:         TListenKnoten *node = new TListenKnoten;
                     node->data = Inhalt;  // Besetze die Daten
                     node->next = Anker; // Hänge die bisherige Liste an
                     Anker = node;       // Setze den Anfangspunkt hierher
        }
    } while (Inhalt);
    // Gebe die Liste in umgekehrter Reihenfolge aus
    // und lösche dabei die ausgegebenen Elemente
    while (Anker)    // ungleich 0! Die Liste ist nicht leer!
    {
        cout << Anker->data << endl;
        old = Anker;         // Sichere zum späteren Löschen
        Anker = Anker->next; // Ziehe nächstes Element nach vorn
        delete old;          // Lösche das ausgelesene Element
    }
}




Bei Zeile x wird immer wieder neuer Speicher benutzt aber (das ist was ich nicht verstehe) IMMER MIT EIN UND DENSELBEN ZEIGER "node". Wie unterscheidet das Programm die unterschiedlichen Speicher wenn alle mit "node" gleichzeitig zu erreichen sind ?
-----
Edit: cpp-Tags eingefügt; - beim nächsten mal bitte selber machen.

Dieser Post wurde am 24.02.2014 um 17:43 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.02.2014, 18:02 Uhr
Hans
Library Walker
(Operator)


Hi,
das ist jetzt etwas umständlich zu erklären, deshalb nur kurz der Tip: Sieh Dir das Geschehen am besten mit einem Debugger an, der auf Quellcodeebene arbeitet, und sofern die Möglichkeit besteht, wie er auf den Specher zugreift.

Ansonsten: über den Zeiger node greifst Du immer auf den Zeiger next der Datenstruktur zu, den Du mit den Zeilen

C++:

node->next = Anker; // Hänge die bisherige Liste an
Anker = node;       // Setze den Anfangspunkt hierher


jedesmal änderst. Am besten malt man sich das mal auf um es nachzuvollziehen.

-----
Edit:
Die Adresse, die dem Zeiger in Zeile x zugewiesen wird, speicherst Du am Ende des if-blocks in Anker, was einen Zwischenspeicher darstellt. Dadurch kann der Wert von node überschrieben werden ohne dass man ein Problem bekommt, denn der bisherige Wert befindet sich ja in Anker. Und Anker wird ja zuvor wiederum im next-element der aktuellen Struktur gesichert, womit die Verkettung der Elemente gewährleistet ist.
Du kannst die Zuweisung an Anker ja mal testweise weg lassen, also so:

C++:
        if (Inhalt)
        {
                     // Neues Element für die Liste erzeugen:
/*Zeile x: */        TListenKnoten *node = new TListenKnoten;
                     node->data = Inhalt;  // Besetze die Daten
                     node->next = Anker; // Hänge die bisherige Liste an
                     // Anker = node;       // Setze den Anfangspunkt hierher - Testweise auskommentiert
        }



dann wird das Programm nichts mehr ausgeben. Sowas sollte man im allgemeinen aber tunlichst sein lassen, weil man dadurch Speicher voll schreibt, auf den man später nicht mehr zugreifen kann.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 24.02.2014 um 21:10 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: