Zum Inhalt springen

dynamischer speicher


Empfohlene Beiträge

Geschrieben

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>

Geschrieben

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>

Geschrieben

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>

Geschrieben

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... :D

Der Käptn

<FONT COLOR="#a62a2a" SIZE="1">[ 13. September 2001 09:47: Beitrag 1 mal editiert, zuletzt von captain haddock ]</font>

Geschrieben

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...?

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...