16 - 2.4.2 C-Kurzeinführung: Dynamische Speicherverwaltung, sizeof-Operator, Cast-Operator [ID:14736]
50 von 165 angezeigt

Ja, soweit zum Thema Felder. Eng damit verknüpft ist das Thema dynamische Speicherverwaltung.

Felder können ja nur in statischer Größe definiert werden, mit Ausnahme, wie ich es

schon erwähnt hatte, bei lokalen Feldern vom Speichertyp Automatic. Wenn aber die Größe

eines Fells erst zur Laufzeit bekannt wird, ich das Ganze aber in der Speicherklassistätik

brauche, dann ist die einzige Möglichkeit, dass ich den benötigten Speicherbereich zur

Laufzeit vom Betriebssystem anfordere und dem Betriebssystem damit sage, dass es den

Speicherbereich von statischen Speicher entsprechend vergrößern soll und einen Zeiger auf den

da reservierten Speicherbereich zurückgeben soll. Die Funktion, die es dazu gibt, ist

malloc und das Ergebnis der Funktion malloc ist ein Zeiger auf den Anfang des Speicherbereichs,

den man da angefordert hat. Und der Zeiger kann danach ganz normal wie ein Feld verwendet

werden, man kann also mit dem eckigen Klammeroperator darauf zugreifen. Die Schnittstelle dieser

malloc-Funktion ist folgende, das Ergebnis ist vom Typ void-Stern. Wir kennen jetzt schon

Funktionen, die einen void liefern. Funktionen, die einen void liefern, liefern nichts, also

haben keinen Rückgabewert. Und void-Stern ist was anderes, das ist also nicht etwa ein

Zeiger auf nichts, sondern die Semantik von void-Stern ist, das ist ein Zeiger auf irgendwas.

Auf void-Stern-Zeigern können Sie natürlich keine Operationen ausführen, Sie können

kein plus plus auf einen void-Stern-Zeiger machen, denn bei einem Zeiger auf irgendwas

wissen Sie ja nicht, wie groß so ein Datenobjekt ist, auf das der Zeiger zeigt und damit können

Sie mit der plus plus-Operation auch nicht ein Objekt weiter schalten, weil Sie ja nicht

wissen wie groß es ist. Diese void-Stern-Zeiger werden deswegen eigentlich nur an den Stellen

verwendet, wo eben irgendwelche Zeiger zurückgegeben werden und üblicherweise, bevor man mit so

einem void-Stern-Zeiger weiter arbeitet, weist man denen dann einem konkreten Zeiger, einem

integer Zeiger, einem double Zeiger oder einem character Zeiger zu und mit dem getippte Zeiger

dann macht man dann die weiteren Operationen. Und genauso passiert es auch hier in diesem

Beispiel. Ich habe also jetzt hier ein Feld, ein Feld das ich zur Laufzeit erst vom Betriebssystem

hier besorgen möchte und ich habe einen integer-wert-größe, wo dann irgendwie die Größe dann zur

Laufzeit drin steht. Und jetzt kann ich hier hinschreiben, Feld ist gleich malloc von

Größe mal, jetzt muss ich noch rausbekommen, wie groß ist denn ein Feld-Element und das

kann ich zum Beispiel dadurch machen, dass ich diesen size-of-Operator verwende. Der

size-of-operator liefert mir von einem Datentyp die Größe dieses Datentyps. Also letztendlich

die Zahl der bytes, die der Compiler für die Reservierung von Speicher von so einem Datentyp

reservieren würde. Und nachdem bei manchen Datentypen der Compiler abhängig ist, wie

viele bytes reserviert werden, also gerade beim Typ integer ist es ja so, dass bei manchen

Prozessoren, also vor allem bei 8 und 16 bit Prozessoren, ein integer nur 2 byte lang

ist, also 16 bit lang ist und die entsprechenden Compiler würden dann eben für den integer

auch nur 2 byte reservieren, während bei den ganzen größeren Prozessoren integer 4 byte

lang ist. Und deswegen ist es natürlich keine gute Idee, wenn man jetzt Speicher reserviert

für einen bestimmten Datentyp, wenn man da 2 oder 4 hinschreibt, wenn man Speicher anfordert,

sondern man überlässt es einfach dem Compiler und abhängig von der Plattform, für die

der Compiler einen Code erzeugt, wird dann eben entsprechend die richtige Größe vom

Compiler eingesetzt. Also nehmen wir mal an integer ist jetzt in unserem Beispiel hier

4 bytes groß, dann würde er also einen Merlok machen von Größe mal 4. Jetzt könnte es

natürlich sein, dass das Betriebssystem keinen Speicher mehr hat, oder nicht genügend Speicher

hat. Kommt ja darauf an, wie viel man hier anfordert. Und wenn das Betriebssystem nicht

genügend Speicher verfügbar hat oder aufgrund von irgendwelchen Speicherlimits an den Prozess,

der dieses Programm gerade ausführt, nicht so viel Speicher rausgeben möchte, dann würde

diese Merlok-Funktion fehlschlagen. Und das muss man natürlich irgendwie dem Aufrufer

von der Merlok-Funktion auch mitteilen, dass sie jetzt fehlgeschlagen ist. Und das tut

die Merlok-Funktion, indem sie einen ganz speziellen Zeiger zurückgibt, nämlich einen

sogenannten Nullpointer. Das ist ein Zeiger auf die Adresse Null. Und nachdem da an der

Teil einer Videoserie :

Zugänglich über

Offener Zugang

Dauer

00:14:46 Min

Aufnahmedatum

2020-05-03

Hochgeladen am

2020-05-03 13:16:26

Sprache

de-DE

Tags

module programmstruktur Variablen Datentypen Preprozessor Gültigkeit
Einbetten
Wordpress FAU Plugin
iFrame
Teilen