C C allocate und free

  • Ersteller Ersteller s4ms3milia
  • Erstellt am Erstellt am
Status
Für weitere Antworten geschlossen.
S

s4ms3milia

Gast
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.
 
mistake2 gibt einen int* zurück und Du referenzierst ihn noch einmal?
Du hast dann einen Pointer auf den Pointer (int**), weist dann den int** auf einen int* zu.

Ich wage zu bezweifeln, dass das zum gewünschten Ergebnis führt...
 
Es ist halt von vorne bis hinten murks, ich habe das so bekommen als Aufgabe.
Es soll halt irgendwie der allokierte speicher wieder gefree'd werden, und ich sehe partout keine Möglichkeit dies in der letzten Zeile zu tun.
 
Du solltest dir vielleicht mal aufzeichnen, was wohin zeigt und da vor allem das &mistake2 ()[1] beachten. Was du dir da überlegen musst, ist, ob &mistake2 ()[1] gleichbedeutend mit (&mistake2 ())[1] oder mit &(mistake2 ()[1]) ist.

Es kann gut sein, dass du mit einer einzigen Zeile nicht (sinnvoll) auskommen wirst.
 
Code:
free (p[1]-1);

So gehts :)

Danke für die Hilfe (so weit.. )
 
Ich bin mir jetzt nicht ganz sicher, aber es wäre möglich, dass char nicht immer nur ein Byte gross ist.
Um sicherzugehen, dass du auch wirklich die richtige Datenbreite von char erwischst, wäre das hier vielleicht die bessere Variante:
Code:
free (--(p[1]));
oder so:
Code:
free (p[1] - sizeof(char));
 
Ich dachte ich hätte die -1 nur verwendet um den Index des Arrays zu dekrementieren, sprich um p[1]-1 auf buf[0] zeigen zu lassen. Ist da die 1 nicht ausreichen?
 
Im Prinzip schon, unter der Voraussetzung, dass das Programm mit 1-Byte Zeichensätzen arbeitet. Wenn char aber 2 Byte breit ist, musst du -2 benutzen, weil du in dem Moment einen Zeiger dekrementierst. Mit sizeof(char) umgehst du das Problem, weil dann automatisch die richtige Zahl verwendet wird.
 
Zuletzt bearbeitet:
Ein char ist immer ein Byte groß. Definiert sowohl der C- als auch der C++-Standard. Außerdem ist die größe von Char völlig irrelevant wenn ein int* dekrementiert wird.

Das Programm hat außerdem ein Problem, wenn sizeof(char) * 4 < sizeof(int) ist.

Der Aufruf von free ist ansonsten theoretisch mit free(p[1]-1) korrekt. Allerdings muss er nicht funktionieren, da printf ("2 %d\n", *p[1]); undefiniertes Verhalten ist (dereferenzieren eines Speicherbereichs, der nicht allokiert ist). Kann funktionieren (und irgendeinen Müll ausgeben), muss es aber nicht. Es dürfen auch Nasenkobolde aus dem Rechner geflogen kommen, der Zugriff ist schlichtweg undefiniert.

Grüße
 
Und das nächste mal machst du deine Hausaufgaben bitte selbst. Du stellst hier die gesamte Aufgabe, ohne einen richtigen Lösungsansatz. So gehts nicht!
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben