Menu
CoddyTech

Użycie sizeof() do alokacji

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

Chociaż malloc() umożliwia dynamiczne przydzielanie pamięci, istnieje ważna dobra praktyka, która sprawia, że Twój kod jest bardziej przenośny i łatwiejszy w utrzymaniu: używanie operatora sizeof() do określenia, ile bajtów przydzielić.

Operator sizeof() zwraca liczbę bajtów potrzebnych do przechowania danego typu danych w Twoim systemie. Zamiast wpisywać rozmiary bajtów na sztywno, możesz pozwolić, aby sizeof() automatycznie obliczył prawidłową wartość:

// Zamiast zgadywać liczbę bajtów:
int *ptr = (int*)malloc(4);  // Zakłada, że int zajmuje 4 bajty

// Użyj sizeof(), aby zapewnić przenośność:
int *ptr = (int*)malloc(sizeof(int));  // Zawsze poprawne

To podejście staje się szczególnie przydatne przy przydzielaniu pamięci dla tablic. Aby przydzielić pamięć dla wielu elementów, pomnóż liczbę elementów przez rozmiar każdego elementu:

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

// Przydziel pamięć na 5 wartości 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. Odczytać od użytkownika liczbę całkowitą n, określającą liczbę elementów do zaalokowania
  2. Użyć malloc() z sizeof(), aby dynamicznie zaalokować pamięć na tablicę n wartości typu double
  3. Rzutować zwrócony wskaźnik void na wskaźnik do double
  4. Odczytać od użytkownika n wartości typu double i zapisać je w zaalokowanej tablicy
  5. Obliczyć całkowitą ilość zaalokowanej pamięci w bajtach i wypisać ją w formacie: Memory allocated: [bytes] bytes
  6. Obliczyć i wypisać średnią wszystkich wartości z dokładnością do 2 miejsc po przecinku w formacie: Average: [value]
  7. Znajdź i wypisz największą wartość 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 zademonstrować, jak sizeof() zapewnia prawidłową alokację pamięci niezależnie od rozmiarów typów danych w systemie.

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

3
2.5 7.8 4.1

Oczekiwane dane wyjściowe:

Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80

To wyzwanie podkreśla znaczenie używania sizeof(), aby dynamiczna alokacja pamięci była przenośna i łatwa w utrzymaniu. Pozwala to automatycznie obliczyć prawidłową liczbę bajtów potrzebną dla dowolnego typu danych w każdym 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