C allocate und free

exasam

Enthusiast
Thread Starter
Mitglied seit
15.08.2007
Beiträge
2.277
Hi, habe hier ne ziemlich blöde Aufgabe:

Code:
(...)

int *
mistake2 ()
{
  int *buf = [COLOR="Red"]malloc[/COLOR] (sizeof (char) * 4);
  buf[0] = 2;
  return buf;
}

(...)

int
main (void)
{
/*Zeilen nicht verändern*/
  int *p[4] = { &mistake1 ()[1], [COLOR="Red"]&mistake2 ()[1][/COLOR], mistake3 (), mistake4 () };

  printf ("1 %d\n", *p[0]);
  printf ("2 %d\n", *p[1]);
  printf ("3 %d\n", *p[2]);
  printf ("4 %d\n", *p[3]);  

/* free korrekt verwenden*/
  [COLOR="Red"]free[/COLOR] (p[1]);
}

Und zwar soll dort in der letzten Zeile ein korrekter aufruf von free stattfinden. So dass der in mistake2() allokierte speicher wieder freigegeben wird. Alles was man hat ist also der pointer aus in *p[4]..

Ich bekomme es einfach nicht auf die Reihe. Wir könnten auch in der Methode mistake2 etwas verändern, sollen aber die Änderungen so gering wie möglich halten.
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Wichtig ist doch erstmal, dass du herausfindest, was du free'n willst. Und das ist der Speicher an der Adresse &(p[1] - 1). p[1] ist die Adresse von buf[1], buf selber ist 4 Byte groß und vom Typ int. Da ein Int erstmal garantierte 16 Bit bzw 2 Byte groß ist, enthält buf also nur zwei Elemente (Indizes 0 und 1). Entsprechend ist die Anfangsadresse von buf halt &(buf[1] - 1).
Klar?
 
Zuletzt bearbeitet:
Hey Lord,

danke dir, war inzwischen auch schon drauf gekommen. Kann einem echt den Kopf verdrehen.
 
Hey Lord,

danke dir, war inzwischen auch schon drauf gekommen. Kann einem echt den Kopf verdrehen.

Vernünftiges Speichermanagement ist ein Segen, das kann man gar nicht genug üben. ;) Du würdest dich wundern, wieviele Dangling Pointers in kommerzieller Software rumhängen.
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh