Überprüfung auf Allokationsfehler
Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 34 von 63.
Obwohl malloc() ein leistungsstarkes Werkzeug für die dynamische Speicherzuweisung ist, musst du eine wichtige Tatsache verstehen: malloc() kann fehlschlagen. Wenn dem System kein verfügbarer Speicher mehr zur Verfügung steht, kann malloc() deine Anfrage nicht erfüllen und gibt stattdessen NULL anstelle einer gültigen Speicheradresse zurück.
Das bedeutet, dass du jedes Mal, wenn du malloc() verwendest, überprüfen musst, ob der Aufruf erfolgreich war, bevor du versuchst, den zurückgegebenen Zeiger zu verwenden. Die Verwendung eines NULL-Zeigers führt dazu, dass dein Programm mit einem Speicherzugriffsfehler abstürzt.
int *ptr = (int*)malloc(sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return -1; // Beende das Programm oder behandle den Fehler
}
// Hier kann ptr sicher verwendet werden
*ptr = 42;Diese NULL-Prüfung ist nicht optional – sie ist entscheidend für das Schreiben robuster C-Programme. Auch wenn Fehler bei der Speicherzuweisung auf modernen Systemen selten sind, können sie auftreten, insbesondere in ressourcenbeschränkten Umgebungen oder wenn große Mengen an Speicher angefordert werden. Professioneller C-Code enthält immer diese Prüfungen, um Abstürze zu verhindern und eine ordnungsgemäße Fehlerbehandlung zu ermöglichen.
Aufgabe
EinfachSchreibe ein C-Programm, das die korrekte Fehlerbehandlung bei der Verwendung von malloc() für die dynamische Speicherzuweisung demonstriert. Dein Programm sollte:
- Eine Ganzzahl
nvom Benutzer einlesen, die die Anzahl der zu speichernden Ganzzahlen angibt malloc()zusammen mitsizeof()verwenden, um dynamisch Speicher für ein Array ausnGanzzahlen zuzuweisen- Überprüfen, ob die Speicherzuweisung erfolgreich war, indem getestet wird, ob der zurückgegebene Zeiger
NULList - Wenn die Zuweisung fehlschlägt,
Memory allocation failed!ausgeben und das Programm beenden - Wenn die Zuweisung erfolgreich ist,
Memory allocation successful!ausgeben nganzzahlige Werte vom Benutzer einlesen und sie im zugewiesenen Array speichern- Die Summe aller Werte berechnen und im Format
Sum: [value]ausgeben - Die insgesamt zugewiesene Bytemenge im Format
Bytes allocated: [value]ausgeben
Denke daran, den Header <stdlib.h> einzubinden, um malloc() verwenden zu können. Dein Programm muss die grundlegende Praxis demonstrieren, vor dem Versuch, den zugewiesenen Speicher zu verwenden, auf einen Fehler bei der Speicherzuweisung zu prüfen.
Wenn die Eingabe beispielsweise lautet:
4
10 20 30 40sollte deine Ausgabe wie folgt aussehen:
Memory allocation successful!
Sum: 100
Bytes allocated: 16Diese Aufgabe unterstreicht die entscheidende Bedeutung defensiver Programmierung bei der Arbeit mit dynamischer Speicherzuweisung und stellt sicher, dass deine Programme potenzielle Fehler bei der Speicherzuweisung ordnungsgemäß behandeln, anstatt unerwartet abzustürzen.
Probier es selbst
#include <stdio.h>
#include <stdlib.h>
int main() {
// Lese die Anzahl der Ganzzahlen
int n;
scanf("%d", &n);
// TODO: Schreibe deinen Code hier
// - Verwende malloc(), um Speicher für n Ganzzahlen zu allokieren
// - Prüfe, ob die Allokation erfolgreich war
// - Behandle sowohl Erfolgs- als auch Fehlerfälle
// - Lies die Ganzzahlen und speichere sie
// - Calculate the sum and bytes allocated
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