Dynamische Allokation - malloc()
Teil des Abschnitts Logic & Flow der C-Journey von Coddy — Lektion 32 von 63.
Jetzt lernen Sie etwas über malloc(), die primäre Funktion zum Anfordern von Speicher vom Heap während der Programmausführung. Die Funktion malloc() steht für „memory allocation“ und ermöglicht es Ihnen, Speicher dynamisch zu reservieren, wenn Sie ihn benötigen, anstatt Variablen mit fester Größe zur Kompilierzeit zu deklarieren.
Die Funktion malloc() nimmt ein Argument entgegen: die Anzahl der Bytes, die Sie allozieren möchten. Sie gibt einen Void-Pointer auf den allozierten Speicherblock zurück, oder NULL, falls die Allozierung fehlschlägt. Da sie einen Void-Pointer zurückgibt, können Sie diesen direkt einem typisierten Pointer zuweisen; das Casting ist in C optional (im Gegensatz zu C++, wo es erforderlich ist).
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Speicher für eine Ganzzahl reservieren
// ptr zeigt nun auf einen Speicherbereich, der eine Ganzzahl aufnehmen kannDer entscheidende Vorteil von
malloc()ist die Flexibilität – Sie können genau die Menge an Speicher anfordern, die Sie zur Laufzeit benötigen, und dieser Speicher bleibt verfügbar, bis Sie ihn explizit freigeben. Dies ist besonders nützlich, wenn Sie erst während der Ausführung Ihres Programms wissen, wie viel Speicher Sie benötigen werden.
Denken Sie daran, <stdlib.h> einzubinden, um malloc() zu verwenden; das Casten des zurückgegebenen Void-Pointers ist in C optional, da er automatisch in den Typ konvertiert wird, dem Sie ihn zuweisen.
Aufgabe
EinfachSchreiben Sie ein C-Programm, das die dynamische Speicherallokation mit malloc() demonstriert, um einen einzelnen Integer auf dem Heap zu erstellen und damit zu arbeiten. Ihr Programm sollte:
malloc()verwenden, um dynamisch Speicher für einen Integer zu reservieren- Den zurückgegebenen Void-Pointer in einen Integer-Pointer casten
- Einen Integer-Wert aus der Benutzereingabe lesen
- Den eingegebenen Wert mithilfe des Dereferenzierungsoperators im dynamisch reservierten Speicher speichern
- Den gespeicherten Wert im Format
Stored value: [value]ausgeben - Das Quadrat des Wertes berechnen und an derselben Speicherstelle speichern
- Den quadrierten Wert im Format
Squared value: [value]ausgeben
Denken Sie daran, den Header <stdlib.h> einzubinden, um malloc() zu verwenden. Ihr Programm sollte den grundlegenden Arbeitsablauf der dynamischen Speicherallokation demonstrieren: Speicher vom Heap anfordern, diesen zum Speichern und Bearbeiten von Daten verwenden und mit dem reservierten Speicher über Pointer-Operationen arbeiten.
Wenn der Benutzer beispielsweise 7 eingibt, sollte Ihre Ausgabe wie folgt aussehen:
Stored value: 7
Squared value: 49Diese Herausforderung führt Sie in das grundlegende Konzept der dynamischen Speicherallokation ein, bei der Speicher zur Laufzeit angefordert wird, anstatt zur Kompilierzeit festgelegt zu sein, was Ihren Programmen eine größere Flexibilität bei der Speichernutzung verleiht.
Probier es selbst
#include <stdio.h>
#include <stdlib.h>
int main() {
// Eingabe lesen
int input_value;
scanf("%d", &input_value);
// TODO: Schreibe deinen Code unten
// 1. Verwende malloc(), um Speicher für einen Integer zu reservieren
// 2. Caste den zurückgegebenen Pointer zu int*
// 3. Speichere den Eingabewert im reservierten Speicher
// 4. Gib den gespeicherten Wert aus
// 5. Berechne das Quadrat und speichere es an derselben Stelle
// 6. Gib den quadrierten Wert aus
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
1Zeiger-Grundlagen
Was ist ein Zeiger?Zeiger deklarierenDer Adressoperator (&)Der Dereferenzierungsoperator (*)NULL-ZeigerZusammenfassung: Zeiger-Grundlagen4Projekt: Einfaches Text-Tool
ProjektübersichtZeichen zählen2Pointer und Arrays
Array-Namen als PointerArray-Elemente - PointerPointer-ArithmetikPointer vergleichenWiederholung: Array-Durchlauf mit Pointern5Zeiger und Funktionen
Wertübergabe (Pass-by-Value)Zeiger an Funktionen übergebenVariablen über Zeiger ändernEin klassisches Beispiel: SwapArrays an Funktionen übergebenZusammenfassung: Zeiger als Funktionsargumente8Structs und Zeiger
Zeiger auf StructsDer Pfeiloperator (->)Structs per Wert übergebenÜbergabe von Struct-ZeigernDynamische Allokation von StructsZusammenfassung: Struct ändern - Ptr11Finale Wiederholungsaufgaben
Wiederholung: Dynamische String-KonkatenationWiederholung: Array von StructsWiederholung: Wortfrequenz-Zähler3Character-Arrays und Strings
Strings als char-ArraysDer Null-TerminatorString-Eingabe mit scanfVerwendung von strlen()Verwendung von strcpy()Verwendung von strcat()Verwendung von strcmp()Zusammenfassung: Grundlegende String-Funktionen6Speicherverwaltung
Stack vs. Heap SpeicherDynamische Allokation - malloc()Verwendung von sizeof() für die AllokationÜberprüfung auf AllokationsfehlerSpeicher freigeben mit free()Allokation mit calloc()Rückblick: Dynamische Arrays