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
Presenters
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