Sind ein Pointer anfangs auf NULL ?
-
Guten Morgen !
Speichert C++ die aktuelle Pointer-Position eines C-Strings intern ?
-> Beispielchar *sptr = new char[400]; char buffer[20] = "..."; memcpy(sptr + 20, buffer, 20);
Dieser Code bdefindet sich in einer Funktion, die sehr oft aufgerufen wird. Werden jetzt die Positionen des C-Strings gespeichert so das er bis 400 hochzählt oder werden IMMER NUR die ersten 20 Byte überschrieben ?
P.S.: Sorry wegen der etwas verqueren Fragestellung, aber ich bin noch nicht ganz wach.
-
nur die ersten 20 bis 40 bytes
-
Sind EIN Pointer .. ?
Nein, Pointer haben in der Final-Version ein undef. Zustandchar *test; // da steht muell drin
Aber das hast du wohl nicht gefragt..
Deshalb:
- in deinem Char-Block sptr steht nach "new" irgendwas drin... aber
kaum Null..
- mit memcpy wird nur GENAU der angegebene Bereich ueberschrieben
- es werden keine Positionen gespeichert
- wenn diese Funktion sehr oft aufgerufen wird, erhaelst du sehr viele
Memory-Leaks!Also: in sptr stehen nun
20x undef, danach 3x'.', danach ein Null und der Rest (bis Byte 400) waere wieder mit undef gefuellt...SolariX
-
Solaris'dUKe schrieb:
wenn diese Funktion sehr oft aufgerufen wird, erhaelst du sehr viele
Memory-Leaks!Was heißt das bitte ???
P.S.: Ich habe mir gerade noch einmal meinen Code, den ich hier gepostet habe, angesehen...totaler Müll.
Hier die korrigierte Version, wie ich sie nutze ...
char *sptr = new char[475]; char buffer[20] = "...abc..."; // Hier sind "in Echt" zwanzig Zeichen "drin" int i = 0; memcpy(sptr + i, buffer, 19); // Ich habe 19 genommen, damit kein \0 kopiert wird. i += 19; // der Zähler wird sonst über eine Funktion erhöht, die auch überprüft ob i > (475 - 19) ist.
Habe aber noch eine Frage:
Ich kopiere jetzt nur noch 19 Bytes mit memcpy um terminierende Null "\0" mit zu kopieren, ist das richtig so ???
Später, zum Anzeigen des 475-starken Strings füge ich dem ganzen ein String-Ende Zeichen hinzu.
-
Michael__W. schrieb:
Was heißt das bitte ???
dass "delete" fehlt
Michael__W. schrieb:
Ich kopiere jetzt nur noch 19 Bytes mit memcpy um terminierende Null "\0" mit zu kopieren, ist das richtig so ???
Später, zum Anzeigen des 475-starken Strings füge ich dem ganzen ein String-Ende Zeichen hinzu.theoretisch schon.. aber in deinem Kommentar schreibst du, dass da "in echt 20 Zeichen" stehen. Du hast also gar keinen Platz mehr fuer eine Null....
Programmieren ist schon geil da kann man viele schoene Fehler machen
-
Solaris'dUKe schrieb:
dass "delete" fehlt
Meinst Du das delete des Puffers (buffer) ???
Solaris'dUKe schrieb:
theoretisch schon.. aber in deinem Kommentar schreibst du, dass da "in echt 20 Zeichen" stehen. Du hast also gar keinen Platz mehr fuer eine Null....
Mit 20 Zeichen meinte ich z.B.: 1234567890123456789 (19 Zeichen, denn bei einem mehr meckert ja der Compiler) also nicht nur ...abc... , denn das wären ja nur 9 Zeichen.
-
Beide Versionen deiner Lösung haben massive Probleme.
Um eine sinnvolle Lösung zu erarbeiten, schildere doch erst einmal was du an dieser Stelle machen willst.
-
Also ...
Es werden in einer Funktion versch. Daten verarbeitet, die dann in den "Main"-String mit Hilfe von memcpy kopiert werden. Hier ist nur der zu verarbeitende String kleiner als der "Main"-String. Dieser ist aber ein Vielfaches des kleineren.
PAD schrieb:
Beide Versionen deiner Lösung haben massive Probleme
Wo sind diese denn zu finden ?
-
Zu den Problemen brauchs du dir nur die Postings noch mal durch zulesen.
int testfunc(void) { char sptr[475+1]; // lege den String bewußt auf dem Stack an damit er bei verlassen der Funktion zerstört wird. // somit kann ich die Funktion über return an jeder Stelle verlassen ohne an des delete/free // denken zu müssen char localResult[20+1]; // das +1 ist eine Marotte von mir um den üblichen Fehler zu // vermeiden das für die schließende Null kein Platz mehr da ist. memset( sptr, 0x00, 476 ); //Damit ist zu jeder Zeit sichergestellt das es ein gültiger C-String ist. .... //Erzeugen eines LocalResults if (error) // Fehler beim Erzeugen des Localresult aufgetreten return -1; memcpy((sptr + i), localResult, 20); // Eintragen in Hauptbuffer memset( localResult, 0x00, 21); // Löschen von localresult, sicherheitshalber, damit nicht im nächten Schritt das // alte Ergebnis eingetragen werden kann. ...... //Ausgabe des Haupotbuffers return 0; }
Eine Alternative dazu. Falls der Hauptbuffer beginnend vom Anfang an und nicht "wild" gefüllt wird ginge auch das
int testfunc(void) { char sptr[475+1]; // s.o. char localResult[20+1]; // s.o. sptr[0]=0x00; .... //Erzeugen eines LocalResults if (error) // Fehler beim Erzeugen des Localresult aufgetreten return -1; strcat(sptr, localResult); // Anhängen an den Hauptbuffer localResult[0]=0x00; // Löschen von localresult, sicherheitshalber, damit nicht im nächten Schritt das // alte Ergebnis eingetragen werden kann. ...... //Ausgabe des Haupotbuffers return 0; }