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 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 korrekt

Dieser 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.

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 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.1

Sollte Ihre Ausgabe wie folgt lauten:

Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80

Diese 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;
}
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