CString kopieren, Verkrüppelte Kopie



  • Weil ich in meinen 500 Seiten dicken C++ Buch nochmal eingelesen habe und das Kapitel "Intermezzo: Zeiger, Arrays, dynamische Datenobjekte" nochmal durchnehme.

    Mit diesem geposteten Stück Code wollte ich testen, ob ich das jetzt ein für alle Mal gerafft habe.

    Zum Beispiel, dass der Blockoperator bei der Inizialisierung dafür sorgt, dass eine Adresse gewählt wird, ab der i Variablen des selben Datentyps reinpassen, ohne was vorhandenes zu überschreiben, wobei i die Zahl innerhalb des Blockoperators ist.

    Und scheinbar ist es wohl doch nicht so bei dem Gemetzel, das ich hier ausgegeben bekomme. Und nun wollte ich wissen, woran das liegt und wie ich das jetzt hinbekomme.



  • 1. Die Funktion ist zum Zeitpunkt der Ausgabe doch durchgelaufen. Das heißt, die Variablen der Funktion existieren nicht mehr. Du hast also einen Zeiger auf eine nicht existierende Variable.
    2. Arrays variabler Länge (strlen(source)+1 als Länge für target) gibt es in C++ nicht.



  • Au ***, stimmt ja. Muss ich schon mit new auf dem heap erzeugen, wegen der Gültigkeit. thx

    LordJaxom schrieb:

    2. Arrays variabler Länge (strlen(source)+1 als Länge für target) gibt es in C++ nicht.

    doch, das hat mir mein oben erwähntes 500 Seiten-Buch bewiesen. "C++ - Einführung und profesionelle Programmierung" von Ulrich Breymann (entspricht dem internationalen C++-Standard ISO/IEC 14882) Hanser Verlag



  • sjBlack schrieb:

    doch, das hat mir mein oben erwähntes 500 Seiten-Buch bewiesen. "C++ - Einführung und profesionelle Programmierung" von Ulrich Breymann (entspricht dem internationalen C++-Standard ISO/IEC 14882) Hanser Verlag

    Die Beweisführung des Buches würde mich interessieren. Letztendlich kann es nur ein Standardauszug mit Ortsangabe sein, der mich überzeugt...

    Nein, in ISO/IEC 14882:2003 gibt es wirklich keine variable-length Arrays. In C99 (ISO/IEC 9899:1999) gibt es die allerdings schon. Aber das hat nichts mehr mit C++ zu tun 😉



  • Dann wäre ja keine String-Klasse möglich, bei der die Adressbelegung springt, wenn es bei der Zuweisung eines größeren Strings nötig wäre!? Ich habe jetzt zum Beispiel cstring eingebunden via #include<cstring>

    und der compiler bietet mir folgende Formalparameterlisten und Rückgaben
    http://img214.imageshack.us/my.php?image=lolfh1.png

    Wie soll das dann möglich sein, wenn variable Arraygröße nicht möäglich ist? Das Ding würd ja andere Variablen einfach mal kreuz und quer überschreiben!



  • sjBlack schrieb:

    Dann wäre ja keine String-Klasse möglich, bei der die Adressbelegung springt, wenn es bei der Zuweisung eines größeren Strings nötig wäre!? Ich habe jetzt zum Beispiel cstring eingebunden via #include<cstring>

    und der compiler bietet mir folgende Formalparameterlisten und Rückgaben
    http://img214.imageshack.us/my.php?image=lolfh1.png

    Wie soll das dann möglich sein, wenn variable Arraygröße nicht möäglich ist?

    sicher, das ist dann aber kein stackarray wie du es angelegt hast, sondern ein mit new erstelltes. himmelweiter unterschied.



  • Auf dem heap ist es also erlaubt? Ich erkenne irgendwie keinen großen Unterschied. Nur dass man Werte auf dem heap mit delete löschen kann. Sonst ist auch kein besonderes Unterschied erläutert. Im Buch steht einfach, das wär jetz dynamisch und das wars. Inwiefern is' es denn jetzt dynamisch!? Naja, das springt jetzt aber komplett aus dem topic title.



  • Du hast den Unterschied selbst bereits erläutert: Das Array auf dem Stack lebt nach dem Rücksprung aus der Funktion nicht mehr, deshalb musst Du es mit new anlegen.



  • Also ist die Lebensdauer und delete der einzige Unterschied?
    Die Aussage "Der heap ist ein Bereich auf dem Arbeitsspeicher" wäre korrekter "Mit new erzeugte Variablen gelten als dynamische Datenobjekte"? Und dynamisches Datenobjekt bedeutet auch nichts anderes als diese Lebensdauer + delete Operator?

    Noch ein paar Fragen -> Ein bisschen Ethik:
    Eine Variable ist eigentlich das, was beim Ansprechen direkt den Wert holt, auf den sie gerichtet ist. Der Wurzelpointer sozusagen. Variable = root pointer
    So bewirkt der Adressoperator &, dass die Variable nicht den Wert auf der Adresse holt, auf die sie gerichtet ist und diesen zurückgibt, sondern einfach nur die Adresse, auf die sie zeigt.



  • sjBlack schrieb:

    Also ist die Lebensdauer und delete der einzige Unterschied?...

    UND die Größenbestimmung zur Laufzeit !

    Gruß,

    Simon2.



  • sjBlack schrieb:

    Noch ein paar Fragen -> Ein bisschen Ethik:
    Eine Variable ist eigentlich das, was beim Ansprechen direkt den Wert holt, auf den sie gerichtet ist. Der Wurzelpointer sozusagen. Variable = root pointer
    So bewirkt der Adressoperator &, dass die Variable nicht den Wert auf der Adresse holt, auf die sie gerichtet ist und diesen zurückgibt, sondern einfach nur die Adresse, auf die sie zeigt.

    nicht ganz; eine variable ist kein zeiger. aber der name der variable verweist auf ein objekt im speicher. (ein objekt im C++-sinn ist ein bestimmter bereich im speicher) zur laufzeit gibt es diese namen nicht mehr, sehr wohl aber die objekte. so bekommst du über den adressoperator zur laufzeit eben die adresse des jeweiligen objekts.


Anmelden zum Antworten