Ich lerne C ++ und derzeit arbeite ich mit Strings und Zeigern.
Ich folge einem Übungsbuch und für eine der Fragen habe ich folgendes erstellt:
%Vor%Um mehr Zeiger zu verwenden, habe ich versucht, sie mit Strings zu mischen und die Lösung aus diesem Grund komplexer zu machen. Wenn ich das ausführe, bekomme ich eine "Unhandled Exception: Access violation Leseort xxxxxxxxx".
Kann jemand bitte eine Lösung vorschlagen, indem er immer noch Zeiger und Strings anstelle von Char-Arrays verwendet (was ich bereits herausgefunden habe)?
Dies liegt daran, dass Sie Ihre Objekte vor ihrer Verwendung nicht zuordnen haben:
%Vor%Es lohnt sich, hinzuzufügen, dass die Verwendung von Zeigern in dieser Situation sinnlos ist: String-Objekte in der C ++ - Standardbibliothek weisen die Daten für die Zeichenfolge vom Heapspeicher zu; Zeichenfolgen sind normalerweise nicht viel mehr als ein Paar Zeiger.
Sie erhalten Fehler, weil Sie Zeichenfolgen als Zeiger verwenden und diese nicht initialisieren. Eine korrekte Vorgehensweise wäre:
%Vor%Sie können tatsächlich Zeiger auf Strings verwenden, aber sie sollen als lokales Objekt verwendet werden und als Referenzen (oder Const-Referenzen, wenn Sie es wünschen) weitergegeben werden.
Die Zugriffsverletzung liegt daran, dass Sie einen Null-Zeiger dereferenzieren.
Nullzeiger ist hier gesetzt
%Vor%und dann dereferenziert hier
%Vor%Sie müssen den Vornamen "point" haben (in diesem Fall eine Zeichenfolge). Hier ist eine modifizierte Version ohne die Ausnahmen.
%Vor%Lesen Sie die 10 Gebote der c-Programmierung . Einige sind für heutige Entwickler mehr oder weniger veraltet, aber einige sind immer noch wichtig, wie der zweite:
Du sollst nicht dem Nullzeiger folgen, denn Chaos und Wahnsinn erwarten dich am Ende.
Das machst du eigentlich hier. Deine Zeiger zeigen nirgendwo hin (siehe die Zuweisungen zu std::nullptr
).
Um dies zu korrigieren, müssen Sie dem Zeiger ein neues Objekt der richtigen Klasse / Struktur zuweisen. Vergessen Sie auch nicht, es später zu löschen:
%Vor% Da Sie nullptr
verwenden, ist eine vollwertige C ++ 11-Lösung wahrscheinlich genauso gut:
Natürlich war nullptr
nicht das, was Sie wollten: Sie müssen die Ressourcen zuweisen, die Sie verwenden möchten.
Beachten Sie, dass die Verwendung von Zeigern in diesen einfachen Fällen sowohl syntaktisch als auch bugweise auf den Fuß erfolgt.
BEARBEITEN Ich habe den Code korrigiert (eine vergessene Klammer und die *
in der letzten Zeile von main
), er kompiliert und läuft auf GCC 4.7.