Cee Besonderheiten
 
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Die SpracheCee hat einige gewöhnungsbedürftige Besonderheiten.
Die Größe der Datentypen (in Bit) ist nicht genau festgelegt

Die Integerdatentypen bilden in Bezug auf ihre Größe folgende Reihe:

 char <= short <= int <= long
Der Datentyp char enthält mindestens 8 Bit.
Der Datentyp Pointer läßt mindestens 16-Bit-Adressen zu.
Die Datentypen short und int enthalten mindestens 16 Bit.
Der Datentyp long enthält mindestens 32 Bit.

Dies läßt aber viele Möglichkeiten offen:

Man beachte, dass das CeeByte und das EdvByte unterschiedlich sein können.

sizeof(type) liefert die Größe in CeeByte, nicht EdvByte!

In einem CSIL64-System ist sizeof(char)==1, ..., sizeof(long)==1 !!!


Die Größe eines Datentyps type in Bit läßt sich so ermitteln:

bits = sizeof(type) * CHAR_¦BIT;
z.B.
bits = sizeof(long) * CHAR_¦BIT;


Eine historische Tabelle zu Datentyp-Größen (Indian Hill style guide):

Typepdp11VAX/11 serie68000 FamilieCray-2Unisys 1100Harris H80080386
char8888988
short16168/1664(32)18248/16
int163216/3264(32)362416/32
long32323264364832
char*16323264722416/32/48
int*16323264(24)722416/32/48
int(*)()163232645762416/32/48


Die C-Speicherverwaltung

C besitzt wie die meisten Programmiersprachen die Möglichkeit globaler und lokaler Variablen. Eine Besonderheit gegenüber älteren Versionen von Sprachen wie FORTRAN, PASCAL oder BASIC ist jedoch die Möglichkeit, Datenstrukturen variabler Größe zur Laufzeit anzulegen, zu verwenden, diese wieder freizugeben und den Speicherplatz wiederzuverwenden. Dies wird als dynamische Speicherverwaltung bezeichnet und mit den Funktionen malloc/calloc/realloc/free abgewickelt.

Als Programmierer steht man oft vor der Wahl, Speicher entweder lokal oder dynamisch anzulegen.

Lokaler Speicher:

void function() { /* Variante 1 */
  char buffer[1024]; /* lokaler Speicher */
  ...
}

Dynamischer Speicher:

void function() { /* Variante 2 */
  char* buffer = malloc(1024); /* dynamischer Speicher */
  if (buffer == NULL) {
     ... Fehlerbehandlung
  }
  ...
  free(buffer); /* Speicher freigeben! */
}

Beide Verfahren unterschieden sich ganz wesentlich in vielerlei Hinsicht. Im allgemeinen ist die Variante 1 vorzuziehen, weil sie einfacher und schneller ist. Die Seite CeeStackKonzept beschäftigt mit diesem Thema im Detail.

Andererseits gibt es viele Situationen, wo die Variante 2 geeigneter ist, ein Problem zu lösen. Gerade C-Neulinge verwenden aber die Variante 2 viel zu häufig und laufen dann in Probleme (z. B. MemoryLeak).


KategorieC KategorieCee
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 29. November 2007 8:26 (diff))
Suchbegriff: gesucht wird
im Titel
im Text