Menu
Coddy logo textTech

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 raten:
int *ptr = (int*)malloc(4);  // Nimmt an, dass int 4 Bytes groß ist

// Verwenden Sie sizeof() für Portabilität:
int *ptr = (int*)malloc(sizeof(int));  // Immer korrekt

Dieser Ansatz wird besonders wertvoll, wenn Arrays zugewiesen werden. Um Speicherplatz für mehrere Elemente zuzuweisen, multiplizieren Sie 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 Doubles reservieren
double *values = (double*)malloc(5 * sizeof(double));

Die Verwendung von sizeof() sorgt dafür, dass Ihr Code auf verschiedenen Systemen, auf denen Datentypen unterschiedliche Größen haben können, korrekt funktioniert, und es kommuniziert klar Ihre Absicht, Speicherplatz für eine bestimmte Anzahl von Elementen eines bestimmten Typs zu reservieren.

challenge icon

Aufgabe

Einfach

Schreiben Sie ein C-Programm, das die korrekte Verwendung von sizeof() mit malloc() für die dynamische Speicherallokation demonstriert. Ihr Programm sollte:

  1. Einen Ganzzahlwert n vom Benutzer einlesen, der die Anzahl der zu allokierenden Elemente darstellt
  2. malloc() zusammen mit sizeof() verwenden, um dynamisch Speicher für ein Array von n double-Werten zu reservieren
  3. Den zurückgegebenen void-Pointer in einen double-Pointer casten
  4. n double-Werte vom Benutzer einlesen und im allokierten Array speichern
  5. Den gesamten allokierten Speicher in Bytes berechnen und im Format Memory allocated: [bytes] bytes ausgeben
  6. Den Durchschnitt aller Werte berechnen und mit genau 2 Dezimalstellen im Format Average: [value] ausgeben
  7. 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 soll 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.1

Sollte Ihre Ausgabe wie folgt lauten:

Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80

Diese Herausforderung verdeutlicht die Wichtigkeit 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.

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;
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logic & Flow