maddin Geschrieben 12. September 2001 Teilen Geschrieben 12. September 2001 mal wieder ein problem, ich habe in meinem programm eine funktion. diese allokiert dynamisch speicher mittels malloc und erweitert diesen mit realloc. beispiel: void f (char* szBuffer) { szBuffer = (char*)malloc (0); // wurde vereinfacht for (int i=0; i<=5; i++) { char* tmp = "0123456789"; szBuffer = (char*)realloc(szBuffer, sizeof(szBuffer) + 10/*sizeof(tmp)*/); memcpy (szBuffer + i*10, tmp, 10); } // läuft cout << szBuffer; } void main() { char* buffer = NULL; f (buffer); cout << buffer; } den code habe ich ein wenig gekürzt. ich hoffe, das es so immer noch läuft. letzendlich wird szBuffer pro durchlauf der schleife um 10 zeichen erweitert. das problem ist nun, das die ausgabe in der funktion einwandfrei funktioniert. wenn ich allerdings versuche im hauptprogramm den wert von buffer auszugeben, dann läuft es nicht mehr. WARUM ??? Ein Frage die ihr mir auch beantworten könnte ist, gibt es einen weg, wie ich realloc durch new bzw delete ersetzen kann ??? <FONT COLOR="#a62a2a" SIZE="1">[ 12. September 2001 11:20: Beitrag 2 mal editiert, zuletzt von maddin ]</font> Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 12. September 2001 Teilen Geschrieben 12. September 2001 Du weist szBuffer in f neu zu. Diese Änderung wirkt sich aber nicht auf den Puffer aus, mit dem Du die Funktion aufrufst. Da Du den Zeiger nicht als Referenz übergibt, wird eine Kopie des Zeigers auf dem Stack angelegt. Diese Kopie wird gelöscht, nachdem f beendet ist. Deklariere f einfach als void f( char*& szBuffer ) Wenn Du new und delete verwenden willst, dann musst Du Dich selbst darum kümmern, den Inhalt des alten Puffers in den neuen zu kopieren und den alten zu löschen. <FONT COLOR="#a62a2a" SIZE="1">[ 12. September 2001 11:31: Beitrag 1 mal editiert, zuletzt von Klotzkopp ]</font> Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
gajUli Geschrieben 12. September 2001 Teilen Geschrieben 12. September 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Klotzkopp: <STRONG> Deklariere f einfach als void f( char*& szBuffer ) </STRONG> Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maddin Geschrieben 12. September 2001 Autor Teilen Geschrieben 12. September 2001 *schlag mich* zeiger sind aber auch blöde dinger. <FONT COLOR="#a62a2a" SIZE="1">[ 12. September 2001 13:00: Beitrag 1 mal editiert, zuletzt von maddin ]</font> Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
haddock Geschrieben 12. September 2001 Teilen Geschrieben 12. September 2001 oder man benutzt einen char** ... @maddin: vielleicht gibt es auch deshalb Probleme, weil außer 'tmp' kein einziger String garantiert nullterminiert ist ??? Der Käptn <FONT COLOR="#a62a2a" SIZE="1">[ 12. September 2001 15:55: Beitrag 2 mal editiert, zuletzt von captain haddock ]</font> Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
gajUli Geschrieben 12. September 2001 Teilen Geschrieben 12. September 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von maddin: <STRONG>*schlag mich* zeiger sind aber auch blöde dinger.</STRONG> Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
haddock Geschrieben 13. September 2001 Teilen Geschrieben 13. September 2001 Vielleicht kam das bei Uli nicht richtig raus: wenn du einen Zeiger als Parameter übergibst, wird eine Kopie des Zeigers erzeugt, die auf dieselbe Adresse zeigt. Ein kopie = (char*)malloc(x); innerhalb deines Funtionsrumpfs weist nun dieser Kopie eine neue Adresse zu, dein Originalzeiger weist aber nach wie vor auf dieselbe Adresse. Wenn du nun am Originalzeiger etwas ändern willst, daßer nämlich auf den im Funktionsaufruf allozierten Speicher zeigt, mußt du an der Adresse des Originalzeigers einen neuen Wert eintragen, deine Funktion kann nur dann funktionieren (sowas, hihi) wenn du die Adresse des Zeigers übergibst, daher: void f(char** pp) // Typ von pp : char** { *pp = (char*)malloc(x); // Typ von *pp : char* } Verwendung: char* p = NULL; f(&p); // Typ von &p ist char** ! // Nun zeigt p auf ein char[x] ! Alles klaro ? Ist nicht ganz trivial, so wie du angefangen hast, das Problem anzugehen... Der Käptn <FONT COLOR="#a62a2a" SIZE="1">[ 13. September 2001 09:47: Beitrag 1 mal editiert, zuletzt von captain haddock ]</font> Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maddin Geschrieben 13. September 2001 Autor Teilen Geschrieben 13. September 2001 vielleicht hab ihr das ein wenig falsch verstanden. der ausspruch "*schlag mich* ..." war deshalb, weil ich mich ärgerte, das ich das übersehen habe. es ist keinesfalls so, das ich zeiger nicht verstehen würde oder sie hasse. ganz im gegenteil. ich liebe sie. womit kann man den sonst so geile sachen machen...? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.