Veröffentlicht 12. September 200123 j 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>
12. September 200123 j 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>
12. September 200123 j <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>
12. September 200123 j *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>
12. September 200123 j 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>
12. September 200123 j <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>
13. September 200123 j 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>
13. September 200123 j 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...?
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.