Verwendung von sizeof() für die Allokation
Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 33 von 63.
Auch wenn malloc() es dir ermöglicht, Speicher dynamisch zuzuweisen, gibt es eine wichtige bewährte Vorgehensweise, die deinen Code portabler und wartungsfreundlicher macht: den Operator sizeof() zu verwenden, um zu bestimmen, wie viele Bytes zugewiesen werden sollen.
Der Operator sizeof() gibt die Anzahl der Bytes zurück, die auf deinem System zum Speichern eines bestimmten Datentyps benötigt werden. Anstatt die Bytegrößen fest zu codieren, kannst du sizeof() die korrekte Anzahl automatisch berechnen lassen:
// Statt die Bytegröße zu schätzen:
int *ptr = (int*)malloc(4); // Nimmt an, dass int 4 Byte groß ist
// Für Portabilität sizeof() verwenden:
int *ptr = (int*)malloc(sizeof(int)); // Immer korrektDieser Ansatz wird besonders wertvoll, wenn Arrays reserviert werden. Um Speicherplatz für mehrere Elemente zu reservieren, multipliziere die Anzahl der Elemente mit der Größe jedes Elements:
// Speicherplatz für 10 Ganzzahlen reservieren
int *arr = (int*)malloc(10 * sizeof(int));
// Speicherplatz für 5 double-Werte reservieren
double *values = (double*)malloc(5 * sizeof(double));Die Verwendung von sizeof() sorgt dafür, dass dein Code auf verschiedenen Systemen korrekt funktioniert, auf denen Datentypen unterschiedliche Größen haben können. Außerdem wird dadurch klar vermittelt, dass du Speicherplatz für eine bestimmte Anzahl von Elementen eines bestimmten Typs reservieren möchtest.
Aufgabe
EinfachSchreibe ein C-Programm, das die korrekte Verwendung von sizeof() mit malloc() für die dynamische Speicherzuweisung demonstriert. Dein Programm sollte:
- Eine Ganzzahl
nvom Benutzer einlesen, die die Anzahl der zuzuweisenden Elemente angibt malloc()mitsizeof()verwenden, um dynamisch Speicher für ein Array mitnWerten vom Typ double zuzuweisen- Den zurückgegebenen void-Zeiger in einen Zeiger auf double umwandeln
nWerte vom Typ double vom Benutzer einlesen und im zugewiesenen Array speichern- Den insgesamt zugewiesenen Speicher in Bytes berechnen und im Format
Memory allocated: [bytes] bytesausgeben - Den Durchschnitt aller Werte berechnen und mit genau 2 Dezimalstellen im Format
Average: [value]ausgeben - Den größten Wert ermitteln und mit genau 2 Dezimalstellen im Format
Largest: [value]ausgeben
Denke daran, den Header <stdlib.h> einzubinden, um malloc() zu verwenden. Dein Programm sollte zeigen, wie sizeof() unabhängig von den Datentypgrößen des Systems die korrekte Speicherzuweisung gewährleistet.
Wenn die Eingabe zum Beispiel lautet:
3
2.5 7.8 4.1Deine Ausgabe sollte lauten:
Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80Diese Aufgabe unterstreicht, wie wichtig es ist, sizeof() zu verwenden, damit deine dynamische Speicherzuweisung portabel und wartbar ist und die benötigte Byteanzahl für jeden Datentyp auf jedem System automatisch korrekt berechnet wird.
Probier es selbst
#include <stdio.h>
#include <stdlib.h>
int main() {
// Lies die Anzahl der Elemente ein
int n;
scanf("%d", &n);
// TODO: Schreibe deinen Code unten
// 1. Reserviere mit malloc() und sizeof() Speicher für n Werte vom Typ double
// 2. Wandle den zurückgegebenen Zeiger in double* um
// 3. Lies n Werte vom Typ double ein und speichere sie im reservierten Array
// 4. Berechne die Größe des reservierten Speichers in Bytes und gib sie aus
// 5. Berechne den Durchschnitt und gib ihn mit 2 Nachkommastellen aus
// 6. Finde den größten Wert und gib ihn mit 2 Nachkommastellen 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 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