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

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

Geschrieben

*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>

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

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

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

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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