Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 16 Dynamische Speicherverwaltung
  gp 16.1 Das Speicherkonzept
  gp 16.2 Speicheralloziierung mit malloc()
  gp 16.3 Die Mysterie von NULL
    gp 16.3.1 NULL für Fortgeschrittene
    gp 16.3.2 Was jetzt – NULL, 0 oder \0 ... ?
    gp 16.3.3 Zusammengefasst
  gp 16.4 Speicherreservierung und ihre Probleme
  gp 16.5 free() – Speicher wieder freigeben
  gp 16.6 Die Freispeicherverwaltung
    gp 16.6.1 Prozessinterne Freispeicherverwaltung
  gp 16.7 Dynamisches Array
  gp 16.8 Speicher dynamisch reservieren mit realloc und calloc
  gp 16.9 Speicher vom Stack anfordern mit alloca (nicht ANSI C)
  gp 16.10 free – Speicher wieder freigeben
  gp 16.11 Zweidimensionale dynamische Arrays
  gp 16.12 Wenn die Speicheralloziierung fehlschlägt
    gp 16.12.1 Speicheranforderung reduzieren
    gp 16.12.2 Speicheranforderungen aufteilen
    gp 16.12.3 Einen Puffer konstanter Größe verwenden
    gp 16.12.4 Zwischenspeichern auf Festplatte vor der Alloziierung
    gp 16.12.5 Nur so viel Speicher anfordern wie nötig


Galileo Computing - Zum Seitenanfang

16.4 Speicherreservierung und ihre Probleme  toptop

Bei einem Aufruf der Funktion malloc() muss die Größe des zu reservierenden Speichers in Bytes angegeben werden. Damit ist die Größe des Speicherobjekts gemeint, das durch einen Zeiger referenziert werden soll. Für die dynamische Speicherzuweisung haben Sie folgende drei Möglichkeiten:

gp  Als numerische Konstante:
    p = (int *)malloc(sizeof(2));
       
    Hiermit werden vier Bytes (!) reserviert, auf deren Anfangsadresse der Zeiger p verweist. Es werden nicht – wie vielleicht irrtümlicherweise angenommen – zwei Bytes reserviert, sondern es wird eben soviel Speicher reserviert, wie es dem Datentyp im sizeof-Operator auf dem entsprechenden System entspricht. Der Wert 2 entspricht gewöhnlich auf 32-Bit-Rechnern 4 Bytes (int). Somit kann die Verwendung einer nummerischen Konstanten sehr verwirrend sein.
       
gp  Die Angabe des Datentyps mithilfe des sizeof-Operators:
    p = (int *)malloc(sizeof(int));
       
    Diese Möglichkeit hat einen Nachteil. Was ist, wenn Sie statt int-Werten auf einmal double-Werte benötigen? Dann müssen Sie mühsam alle Speicherzuweisungen ändern in:
       
    p = (double *)malloc(sizeof(double));
       
gp  Den dereferenzierten Zeiger selbst für den sizeof-Operator verwenden:
    p = (double *)malloc(sizeof(*p));
       
    Aber Achtung: Wehe, der Dereferenzierungsoperator (*) wird wie in folgendem Listing vergessen:
       
/* malloc3.c */
#include <stdio.h>
#include <stdlib.h>
int main(void) {
   double *p1,*p2;
   p1 = (double *)malloc(sizeof(p1)); // Fehler
   p2 = (double *)malloc(sizeof(p2)); // Fehler
   if(p1 != NULL && p2 != NULL) {
         *p1 = 5.15;
         printf("p1 = %f\n",*p1);
         *p2 = 10.99;
         printf("p2 = %f\n",*p2);
      }
   return EXIT_SUCCESS;
}

Wenn Sie »Glück« haben, stürzt das Programm ab. Im schlimmsten Fall funktioniert das Programm und gibt die richtigen Zahlen aus. Das wäre aber purer Zufall. Denn ohne den Dereferenzierungsoperator wird nicht ein double-Wert an malloc() übergeben, sondern die Größe des Zeigers. Und diese beträgt immer vier (bei 32-Bit-Rechnern) statt der erforderlichen acht Bytes. Wenn jetzt ein anderer Wert an diese Adresse gelangt, ist der weitere Verlauf des Programms nicht absehbar. Es kommt zu einer so genannten Überlappung der Speicherbereiche.

 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de