Verwendung von sizeof() für die Allokation
Teil des Abschnitts Logic & Flow der C-Journey von Coddy — Lektion 33 von 63.
Während malloc() es Ihnen ermöglicht, Speicher dynamisch zu reservieren, gibt es eine wichtige Best Practice, die Ihren Code portabler und wartbarer macht: die Verwendung des sizeof()-Operators, um zu bestimmen, wie viele Bytes reserviert werden sollen.
Der sizeof()-Operator gibt die Anzahl der Bytes zurück, die erforderlich sind, um einen bestimmten Datentyp auf Ihrem System zu speichern. Anstatt Byte-Größen fest zu kodieren, können Sie sizeof() den korrekten Betrag automatisch berechnen lassen:
// Anstatt die Byte-Größen zu erraten:
int *ptr = (int*)malloc(4); // Nimmt an, dass int 4 Bytes groß ist
// Verwenden Sie sizeof() für die Portabilität:
int *ptr = (int*)malloc(sizeof(int)); // Immer korrektDieser Ansatz wird besonders wertvoll, wenn Arrays allokiert werden. Um Speicherplatz für mehrere Elemente zu reservieren, multiplizieren Sie die Anzahl der Elemente mit der Größe jedes Elements:
// Speicherplatz für 10 Integers reservieren
int *arr = (int*)malloc(10 * sizeof(int));
// Speicherplatz für 5 Doubles reservieren
double *values = (double*)malloc(5 * sizeof(double));Die Verwendung von sizeof() sorgt dafür, dass Ihr Code auf verschiedenen Systemen korrekt funktioniert, auf denen Datentypen unterschiedliche Größen haben könnten, und es kommuniziert klar Ihre Absicht, Speicher für eine bestimmte Anzahl von Elementen eines bestimmten Typs zu reservieren.
Aufgabe
EinfachSchreiben Sie ein C-Programm, das die korrekte Verwendung von sizeof() mit malloc() für die dynamische Speicherallokation demonstriert. Ihr Programm sollte:
- Einen Ganzzahlwert
nvom Benutzer einlesen, der die Anzahl der zu allokierenden Elemente darstellt malloc()zusammen mitsizeof()verwenden, um dynamisch Speicher für ein Array vonndouble-Werten zu reservieren- Den zurückgegebenen void-Pointer in einen double-Pointer casten
ndouble-Werte vom Benutzer einlesen und im allokierten Array speichern- Den gesamten allokierten 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 finden und mit genau 2 Dezimalstellen im Format
Largest: [value]ausgeben
Denken Sie daran, den Header <stdlib.h> einzubinden, um malloc() verwenden zu können. Ihr Programm sollte demonstrieren, wie sizeof() eine korrekte Speicherallokation unabhängig von den Datentypgrößen des Systems sicherstellt.
Wenn die Eingabe zum Beispiel wie folgt aussieht:
3
2.5 7.8 4.1Sollte Ihre Ausgabe wie folgt lauten:
Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80Diese Herausforderung unterstreicht die Bedeutung der Verwendung von sizeof(), um Ihre dynamische Speicherallokation portabel und wartbar zu machen, indem automatisch die korrekte Anzahl der benötigten Bytes für jeden Datentyp auf jedem System berechnet wird.
Spickzettel
Verwenden Sie den sizeof() Operator mit malloc(), um die korrekte Anzahl an Bytes zu bestimmen, die für einen beliebigen Datentyp reserviert werden sollen:
// Portable Speicherreservierung
int *ptr = (int*)malloc(sizeof(int));
// Reservieren von Arrays
int *arr = (int*)malloc(10 * sizeof(int));
double *values = (double*)malloc(5 * sizeof(double));Der sizeof() Operator gibt die Anzahl der Bytes zurück, die erforderlich sind, um einen Datentyp auf Ihrem System zu speichern, wodurch Ihr Code über verschiedene Plattformen hinweg portabel wird, auf denen Datentypen unterschiedliche Größen haben könnten.
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 Speicher für n double-Werte mit malloc() und sizeof()
// 2. Caste den zurückgegebenen Pointer zu double*
// 3. Lies n double-Werte ein und speichere sie im reservierten Array
// 4. Berechne und gib den reservierten Speicher in Bytes aus
// 5. Berechne und gib den Durchschnitt mit 2 Dezimalstellen aus
// 6. Finde und gib den größten Wert mit 2 Dezimalstellen 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