Menu
Coddy logo textTech

Użycie sizeof() do alokacji

Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 33 z 63.

Chociaż malloc() pozwala dynamicznie przydzielać pamięć, istnieje ważna dobra praktyka, która sprawia, że kod jest bardziej przenośny i łatwiejszy w utrzymaniu: używanie operatora sizeof() do określania liczby bajtów, które należy przydzielić.

Operator sizeof() zwraca liczbę bajtów wymaganych do przechowywania danego typu danych w twoim systemie. Zamiast wpisywać rozmiary w bajtach na sztywno, możesz pozwolić, aby sizeof() automatycznie obliczył właściwą wartość:

// Zamiast zgadywać rozmiary w bajtach:
int *ptr = (int*)malloc(4);  // Zakłada, że int zajmuje 4 bajty

// Użyj sizeof(), aby kod był przenośny:
int *ptr = (int*)malloc(sizeof(int));  // Zawsze poprawne

To podejście jest szczególnie przydatne podczas przydzielania pamięci na tablice. Aby przydzielić miejsce na wiele elementów, pomnóż liczbę elementów przez rozmiar każdego z nich:

// Przydziel pamięć na 10 liczb całkowitych
int *arr = (int*)malloc(10 * sizeof(int));

// Przydziel pamięć na 5 liczb typu double
double *values = (double*)malloc(5 * sizeof(double));

Użycie sizeof() sprawia, że Twój kod działa poprawnie w różnych systemach, w których typy danych mogą mieć różne rozmiary, i jasno komunikuje zamiar przydzielenia miejsca na określoną liczbę elementów danego typu.

challenge icon

Wyzwanie

Łatwy

Napisz program w C, który demonstruje prawidłowe użycie sizeof() z malloc() do dynamicznej alokacji pamięci. Twój program powinien:

  1. Wczytać od użytkownika liczbę całkowitą n, określającą liczbę elementów do zaalokowania
  2. Użyć malloc() wraz z sizeof(), aby dynamicznie zaalokować pamięć na tablicę n wartości typu double
  3. Rzutować zwrócony wskaźnik typu void na wskaźnik do double
  4. Wczytać od użytkownika n wartości typu double i zapisać je w zaalokowanej tablicy
  5. Obliczyć łączną ilość zaalokowanej pamięci w bajtach i wypisać ją w formacie: Memory allocated: [bytes] bytes
  6. Obliczyć średnią wszystkich wartości i wypisać ją z dokładnością do 2 miejsc po przecinku, w formacie: Average: [value]
  7. Znaleźć największą wartość i wypisać ją z dokładnością do 2 miejsc po przecinku, w formacie: Largest: [value]

Pamiętaj, aby dołączyć nagłówek <stdlib.h>, żeby móc użyć malloc(). Twój program powinien pokazywać, jak sizeof() zapewnia prawidłową alokację pamięci niezależnie od rozmiarów typów danych w danym systemie.

Na przykład, jeśli dane wejściowe to:

3
2.5 7.8 4.1

Wynik powinien wyglądać tak:

Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80

To wyzwanie utrwala znaczenie używania sizeof(), aby dynamiczna alokacja pamięci była przenośna i łatwa w utrzymaniu. Dzięki temu automatycznie obliczana jest prawidłowa liczba bajtów potrzebnych dla dowolnego typu danych w dowolnym systemie.

Spróbuj swoich sił

#include <stdio.h>
#include <stdlib.h>

int main() {
    // Wczytaj liczbę elementów
    int n;
    scanf("%d", &n);
    
    // TODO: Napisz swój kod poniżej
    // 1. Przydziel pamięć na n wartości typu double za pomocą malloc() i sizeof()
    // 2. Rzutuj zwrócony wskaźnik na double*
    // 3. Wczytaj n wartości typu double i zapisz je w przydzielonej tablicy
    // 4. Oblicz i wypisz ilość przydzielonej pamięci w bajtach
    // 5. Oblicz i wypisz średnią z dokładnością do 2 miejsc po przecinku
    // 6. Znajdź i wypisz największą wartość z dokładnością do 2 miejsc po przecinku
    
    return 0;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i sterowanie przepływem

Poćwicz samodzielnie: Kompilator C online