Dynamische Allokation - malloc()
Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 32 von 63.
Jetzt lernst du malloc() kennen, die wichtigste Funktion zum Anfordern von Speicher auf dem Heap während der Programmausführung. Die Funktion malloc() steht für „memory allocation“ und ermöglicht es dir, Speicher dynamisch zuzuweisen, wenn du ihn benötigst, anstatt zur Kompilierzeit Variablen fester Größe zu deklarieren.
Die Funktion malloc() nimmt ein Argument entgegen: die Anzahl der Bytes, die du zuweisen möchtest. Sie gibt einen void pointer auf den zugewiesenen Speicherblock oder NULL zurück, wenn die Zuweisung fehlschlägt. Da sie einen void pointer zurückgibt, kannst du ihn direkt einem typisierten Pointer zuweisen; das Casten ist in C optional (anders als in C++, wo es erforderlich ist).
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Speicher für eine Ganzzahl zuweisen
// ptr zeigt jetzt auf eine Speicherstelle, die eine Ganzzahl aufnehmen kannDer entscheidende Vorteil von
malloc()ist die Flexibilität – du kannst zur Laufzeit genau die Menge an Speicher anfordern, die du benötigst, und dieser Speicher bleibt verfügbar, bis du ihn ausdrücklich freigibst. Das ist besonders nützlich, wenn du erst während der Ausführung deines Programms weißt, wie viel Speicher du benötigen wirst.
Denke daran, <stdlib.h> einzubinden, um malloc() zu verwenden. Das Umwandeln des zurückgegebenen Void-Zeigers ist in C optional, da er automatisch in den Typ konvertiert wird, dem du ihn zuweist.
Aufgabe
EinfachSchreibe ein C-Programm, das die dynamische Speicherzuweisung mit malloc() demonstriert, um eine einzelne Ganzzahl auf dem Heap zu erstellen und damit zu arbeiten. Dein Programm sollte:
malloc()verwenden, um dynamisch Speicher für eine Ganzzahl zuzuweisen- Den zurückgegebenen void-Zeiger in einen Ganzzahlzeiger umwandeln
- Einen Ganzzahlwert aus der Benutzereingabe lesen
- Den Eingabewert mithilfe des Dereferenzierungsoperators im dynamisch zugewiesenen Speicher speichern
- Den gespeicherten Wert im Format
Stored value: [value]ausgeben - Das Quadrat des Werts berechnen und an derselben Speicherstelle speichern
- Den quadrierten Wert im Format
Squared value: [value]ausgeben
Denke daran, den Header <stdlib.h> einzubinden, um malloc() verwenden zu können. Dein Programm sollte den grundlegenden Ablauf der dynamischen Speicherzuweisung demonstrieren: Speicher vom Heap anfordern, ihn zum Speichern und Bearbeiten von Daten verwenden und mit dem zugewiesenen Speicher über Zeigeroperationen arbeiten.
Wenn der Benutzer beispielsweise 7 eingibt, sollte deine Ausgabe folgendermaßen aussehen:
Stored value: 7
Squared value: 49Diese Herausforderung führt dich in das grundlegende Konzept der dynamischen Speicherzuweisung ein, bei dem Speicher zur Laufzeit angefordert wird, anstatt zur Kompilierzeit festgelegt zu sein. Dadurch erhalten deine Programme mehr Flexibilität bei der Speichernutzung.
Probier es selbst
#include <stdio.h>
#include <stdlib.h>
int main() {
// Eingabe lesen
int input_value;
scanf("%d", &input_value);
// TODO: Schreibe deinen Code darunter
// 1. Verwende malloc(), um Speicher für eine Ganzzahl zu allozieren
// 2. Cast den zurückgegebenen Zeiger zu int*
// 3. Speichere den Eingabewert im allozierten Speicher
// 4. Gib den gespeicherten Wert aus
// 5. Berechne und speichere das Quadrat an derselben Stelle
// 6. Print the squared value
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
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Übe selbstständig: Online-C-Compiler