11.4    Kontrollfragen und Aufgaben

  1. Welche Funktionen stehen Ihnen zur Verfügung, wenn Sie die Laufzeit eines Speichers vom Heap anfordern möchten? Beschreiben Sie kurz die Unterschiede der einzelnen Funktionen.

  2. Welchen Typ geben alle Funktionen zur dynamischen Speicherreservierung zurück?

  3. Wie können Sie nicht benötigten Speicher wieder an das System zurückgeben?

  4. Im folgenden Codeausschnitt wurde ein übler Fehler gemacht. Welcher?

    01    int *iarray1=NULL, *iarray2=NULL;
    02 iarray1 = malloc( BLK * sizeof(int) );
    03 iarray2 = malloc( BLK * sizeof(int) );
    ...
    04 for(int i=0; i<BLK; i++) {
    05 iarray1[i] = i;
    06 iarray2[i] = i+i;
    07 }
    08 iarray1 = iarray2;
    09 iarray2 = iarray1;
    ...
  5. Erstellen Sie ein Programm, das einen String (char-Array) mit einer unbestimmten Länge einlesen kann.

    Tipp: Lesen Sie den String zunächst in einen statischen Puffer ein, zählen Sie die Zeichen, und reservieren Sie dann Speicher dafür. Hängen Sie gegebenenfalls den neuen Text hinten an.

  6. Schreiben Sie eine Funktion, die ermittelt, ob ein Funktionsaufruf von realloc() den kompletten Speicherblock umkopieren musste. Im Grunde müssen Sie nur die Adressen sichern und miteinander vergleichen. Geben Sie im Falle eines Umkopierens die alte und die neue Speicheradresse (mit %p) auf dem Bildschirm aus.

Im nächsten Kapitel gehen wir nun auf komplexe Datenstrukturen ein, die mehrere Variablen unterschiedlichen Typs beinhalten können. Diese sogenannten strukturierten Datentypen, kurz auch Structs genannt, sind ein weit verbreitetes Programmierelement, mit denen Sie sich das Leben sehr erleichtern können.