Menu
CoddyTech

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 korrekt

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

challenge icon

Aufgabe

Einfach

Schreibe ein C-Programm, das die korrekte Verwendung von sizeof() mit malloc() für die dynamische Speicherzuweisung demonstriert. Dein Programm sollte:

  1. Eine Ganzzahl n vom Benutzer einlesen, die die Anzahl der zuzuweisenden Elemente angibt
  2. malloc() mit sizeof() verwenden, um dynamisch Speicher für ein Array mit n Werten vom Typ double zuzuweisen
  3. Den zurückgegebenen void-Zeiger in einen Zeiger auf double umwandeln
  4. n Werte vom Typ double vom Benutzer einlesen und im zugewiesenen Array speichern
  5. Den insgesamt zugewiesenen 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 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.1

Deine Ausgabe sollte lauten:

Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80

Diese 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;
}
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 Logik & Ablauf

Übe selbstständig: Online-C-Compiler