Hallo und willkommen zurück. In diesem Vortrag möchte ich eine
Demonstration für
unsere vorherige Herausforderung geben, bei der Sie verstanden haben, wie
Sie Speicher mithilfe von Malloc dynamisch zuweisen.
Wir werden nur ein einfaches Lesen von der Tastatur durchführen und
dann eine Zeichenfolge anzeigen, aber wir werden
sie mit dynamisch zugewiesenen Zeigern
und Zeichenzeigern verwenden.
Lassen Sie uns also Codeblöcke aufrufen und ein neues Projekt erstellen.
Und wir werden nur dieses eine Beispiel für eine dynamische Speicherzuweisung nennen.
Und das erste, was Sie tun
müssen, wenn Sie die dynamische Speicherzuweisung verwenden möchten, ist sicherzustellen, dass Sie die Standardbibliothek einbeziehen.
Glücklicherweise wird es beim Erstellen eines Projekts in
Codeblöcken automatisch für Sie eingefügt.
Der Grund, warum wir die Standardbibliothek einbeziehen müssen, ist, dass malloc,
die malloc-Funktion, vorhanden ist. Denken Sie daran, Malloc ist die
Hauptfunktion zum Zuweisen von Speicher. Sie haben auch Calloc.
Calloc ist wirklich wichtig, da Calloc einen
Teil der netten Berechnung der Anzahl der benötigten Bytes übernimmt,
da dies zwei Parameter sind.
Aber das wirklich Gute an Calloc ist, dass es alle Daten auf Null
initialisiert, wenn sie Ints sind und so weiter, eine wirklich nette Funktion.
Sie haben Realloc. Realloc erweitert den bereits
zugewiesenen Speicher. Sie übergeben es also in einem Zeiger.
Anhand dieses Zeigers wird bestimmt, wie viel Speicher ihm zugewiesen
ist, und alles, was sich dort befand, wird an einen neuen Speicherort
kopiert. Anschließend geben Sie an, wie viele weitere
Bytes Sie zuweisen möchten, und fügen es dem neuen Speicherort hinzu nette Funktion.
Denken Sie jedoch daran, dass Sie beim Zuweisen von Speicher für Ganzzahlen mithilfe
von malloc bestimmen müssen, wie viel Speicher Sie Bytes zuweisen möchten, normalerweise
jedoch den Operator sizeof verwenden möchten.
Also hier kommen wir dazu.
In meiner Hauptmethode werde ich eine Ganzzahl erstellen, und ich werde nur sagen,
dass dies nur die Größe sein wird. wird die Größe eingeben, wie viele
Bytes sie zur Laufzeit zuweisen möchten, damit die Größe gespeichert wird.
Die andere Sache, die ich erstellen möchte, ist, dass ich einen Zeichenzeiger erstellen möchte,
und dies wird nur Text sein. Und ich werde dies
auf null initialisieren, weil es nicht auf Anhieb auf irgendetwas hinweist.
Als erstes möchte ich den Benutzer bitten, die Größe einzugeben.
Also werde ich printf
sagen, ich werde das Limit des Textes eingeben.
Und sie geben eine Zahl ein, wie viele Bytes tatsächlich zugewiesen werden sollen, um
die Anzahl der Zeichen zu bestimmen.
Und dann werde ich das mit scanf einlesen.
Scanf, der erste Parameter ist der Typ des Formatbezeichners für den Datentyp.
Dies wird Prozent d sein, weil ich eine ganze Zahl lese.
Und dann denken Sie daran, scanf nimmt einen Zeiger.
Wir wissen jetzt, dass Funktionen,
die Zeiger benötigen, eine Adresse benötigen, um übergeben zu werden.
Wenn ich also die Größe übergeben möchte, ist die Größe keine Adresse, es sei denn, ich verwende die Adresse des Betreibers.
Also werde ich kaufmännisches Und und Größe
sagen, das wird die Anzahl der Bytes einlesen.
Sobald ich die Anzahl der Bytes habe, kann ich jetzt mithilfe der Malloc-Funktion Speicher dafür zuweisen.
Und malloc wird einen leeren Zeiger zurückgeben.
Und der Zeiger wird die erste Adresse für
diesen neu zugewiesenen Speicher sein. Sie können es also direkt dem Text zuweisen.
Denken Sie daran, Text ist ein Zeiger.
Wir möchten Text auf diese neue Adresse verweisen, die zurückgegeben wird.
Da malloc einen ungültigen Zeiger zurückgibt, müssen wir ihn umwandeln.
Die Art der Daten, auf die wir zeigen, ist ein Zeichen, also möchten wir char star
sagen, und dann können wir die malloc-Funktion aufrufen.
Die Malloc-Funktion nimmt die Anzahl der Bytes an.
Wenn Sie also nur die Anzahl der Bytes übergeben haben, werden nur
so viele Bytes zugewiesen. Abhängig vom Datentyp kann
der Datentyp jedoch zwei oder vier Bytes betragen.
Wenn Sie also 10 Zeichen zuweisen möchten, müssen
Sie sicherstellen, dass Sie 10
Zeichen mit der Größe von char multiplizieren.
Jetzt sagen
wir also n-mal sizeof. Der Operator sizeof wird häufig in der
malloc-Funktion verwendet, da er maschinenunabhängig
ist und Ihnen anzeigt, wie viel Sie tatsächlich zuweisen müssen.
Dies ist jetzt relevanter, wenn Sie Ganzzahlen haben. Denken Sie daran, dass Ganzzahlen, abhängig von
dem System, auf dem Sie sich befinden, der Architektur, die Sie
ausführen, Ganzzahlen durch vier Bytes, zwei Bytes, normalerweise zwei oder vier
Bytes dargestellt werden können.
Wenn Sie sagen würden, ich möchte eine Ganzzahl speichern, also
erstelle ich nur vier Bytes Speicher. Nun, das ist möglicherweise nicht richtig, denn
was ist, wenn es zwei Bytes sind?
Sie möchten also immer tun,
wie viele Ganzzahlen oder wie viele Zeichen Sie erstellen möchten, und diese dann mit der
Größe des Zeichens auf Ihrem System multiplizieren. Der Operator Sizeof gibt die Anzahl der Bytes
an, die ein Zeichen belegt. Wenn Sie also 10 Zeichen erstellen möchten,
geben Sie die 10-fache Größe des Zeichens an. Wenn Sie 10 Ganzzahlen erstellen
möchten, um 10 Ganzzahlen
zu speichern, sagen Sie 10-fache Größe von int, das ist wirklich wichtig.
Mit der Calloc-Funktion müssen Sie das jetzt nicht mehr tun. Calloc akzeptiert
tatsächlich zwei Parameter. Und der erste Parameter
ist der Zeiger, den ich denke, und dann
ist der zweite Parameter die Größe der Bytes.
Wenn Sie also 24 int sagen, müssen Sie nur 24
übergeben und automatisch für Sie zuweisen.
Calloc ist also ein wirklich gutes Werkzeug, da Sie diese Multiplikation nicht durchführen müssen.
Für Calloc ist der erste Parameter die Größe.
Wenn Sie also 10 int erstellen möchten, geben Sie einfach 10 ein.
Und dann ist der zweite Parameter
die Größe des Bytes. Sie müssen also nicht multiplizieren. Das erspart Ihnen ein wenig Schritt.
Nachdem wir Speicher zugewiesen haben, möchten
Sie sicherstellen, dass der Text nicht null ist, bevor Sie versuchen, den Text zu de-referenzieren.
Sie möchten dies also immer um einen Nicht-Text wickeln, und das bedeutet, dass er
nicht null ist, oder Sie können dies einfach explizit tun und sagen,
ob Text nicht gleich null ist.
Ich möchte das immer tun, weil es sehr, sehr gefährlich
ist, zu versuchen, einen Zeiger zu de-referenzieren.
Alles könnte passieren. Möglicherweise können Sie Daten darin schreiben.
hinein. Es würde es einfach irgendwo anders in den Speicher schreiben. Es würde
also Ihr Programm vermasseln oder Sie könnten einen Segmentierungsfehler haben und das Programm könnte abstürzen.
Solange Sie diesen Speicher wirklich zuweisen, können
Sie jetzt tatsächlich einige Daten einlesen.
Sie können Git s verwenden oder Sie können scanf hier verwenden.
Sie möchten jedoch
ausdrucken, Text eingeben und
hier auch Zeilenvorschübe hinzufügen, damit diese leicht lesbar sind.
Und wir werden scanf verwenden, da wir damit vertraut sind.
Und scanf wird nur in Prozent
lesen.
Eigentlich werde ich dir einen Trick zeigen.
Ich werde scanf verwenden, um das nächste Zeichen einzulesen, damit
es pausiert, und dann werde ich get s verwenden, um den Text einzulesen.
Und get ist nur eine weitere Funktion, mit der Sie normalerweise f f verwenden können. Sie müssen es nur auf
den Eingabestream einstellen.
Gets wird jedoch aus dem Standardeingabestream gelesen, der standardmäßig die Tastatur ist.
Und bekommt wird einen Zeiger nehmen. Wir müssen also nur Text übergeben, da es sich
bereits um einen Zeiger handelt. Wir müssen nicht die Adresse des Operators eingeben.
Und das Schöne an get ask ist, dass Sie mehrere durch Leerzeichen getrennte Zeichenfolgen lesen können.
Sobald wir tatsächlich eingelesen haben, können
wir es einfach ausdrucken. Wir können also sagen, dass eingegebener
Text ein Wort in Prozent s Backslash n
und dann Kommatext ist. Text ist ein Zeiger.
Printf nimmt einen Zeiger. Wir müssen es nicht de-referenzieren.
Denn wenn Sie nur Text anzeigen,
zeigt Text den Wert des Zeigers an, der eine Adresse sein wird.
Wir möchten tatsächlich den Wert anzeigen, auf den der Text zeigt.
Und dann sind wir fertig. Oh nein, wir sind definitiv nicht fertig. Wir wollen unsere kostenlos anrufen.
Wir wollen unseren Zeiger befreien.
Auch wenn wir beenden, wird der Speicher frei sein. Wir wollen immer noch sicherstellen, dass wir
es freigeben, und dann wollen wir wahrscheinlich auch nur zur sicheren Aufbewahrung, dass wir Text gleich null setzen.
Also lasst uns weitermachen und dies bauen und sehen, was passiert.
Und ich habe ein Problem, weil ich nicht die
richtige Variable einlese.
Hier verwende ich also nicht die richtige Variable. Ich möchte Größe verwenden, und es sieht
so aus,
als wären wir gut.
Der einzige Unterschied besteht darin, dass Sie den Text nicht
de-referenzieren müssen, da Text ein Zeichenzeiger ist.
Sie müssen nur die Referenz aufheben, wenn Sie sich im Zeiger befinden und so weiter. Wenn Sie also
nur die Prozentwerte verwenden, kann der Zeichenzeiger automatisch
de-referenziert werden.
Das ist ein Unterschied, wenn Sie Zeichenzeiger
gegenüber anderen Zeigern verwenden. Die anderen Zeiger müssen
de-referenziert werden, um den Wert zu erhalten, da Sie
Zeichenfolgen nicht in Zeichenfolgenarrays usw. kopieren können.
Sie wären niemals in der Lage, Sternentext gleich
zu machen. Sie müssten immer die str-Kopie verwenden, wenn Sie Text kopieren möchten.
Denken Sie daran, dass Sie einem Array
keine Daten zuweisen können und ein Zeichenzeiger ein Array ist.
Hier sieht das also richtig aus. Kein Grund, darauf zu verweisen.
Wir wollen das bauen und dann wollen wir es ausführen.
Und Sie werden feststellen, dass wir die Grenze des Textes setzen.
Nehmen wir also an, wir geben 5, 6 für jason ein und es
wird gedruckt, dass die Eingabe jason ist.
Und Sie können mit diesem Programm herumspielen. Aber auch hier gehören
zu den Erkenntnissen aus der Standardbibliothek, wenn Sie Malloc machen.
Initialisieren Sie Ihre Zeichenzeiger auf null. Führen Sie einen Scan durch
und verwenden Sie das kaufmännische Und, da die Größe kein Zeiger ist.
Wenn Sie mallocing, gibt malloc einen ungültigen Zeiger zurück, sodass Sie wirken müssen.
Sie wollen immer in Ihrem Malloc. Führen Sie den Operator
sizeof für das aus, wofür Sie ihn zuweisen möchten. Zeiten, wie viele tatsächliche Zeichen oder
ganze Zahlen sind. Dies gilt eher für Ganzzahlen und
primitive Datentypen, die technisch für Zeichen gelten. Sie können nur Größe tun, das sollte gut funktionieren.
Sie möchten immer nach null suchen und sicherstellen, dass es nicht null ist.
Wenn Sie eine Zeichenfolge verwenden.
Und dann geben wir einfach einen Text ein, der in unseren Gets gespeichert ist, und drucken ihn aus.
Und zu guter Letzt wollen wir immer unsere Zeiger freigeben, damit wir das
dem Haufen zurückgeben können. Hoffe das hilft. Vielen Dank.