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 poprawneTo 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.
Wyzwanie
ŁatwyNapisz program w C, który demonstruje prawidłowe użycie sizeof() z malloc() do dynamicznej alokacji pamięci. Twój program powinien:
- Wczytać od użytkownika liczbę całkowitą
n, określającą liczbę elementów do zaalokowania - Użyć
malloc()wraz zsizeof(), aby dynamicznie zaalokować pamięć na tablicęnwartości typu double - Rzutować zwrócony wskaźnik typu void na wskaźnik do double
- Wczytać od użytkownika
nwartości typu double i zapisać je w zaalokowanej tablicy - Obliczyć łączną ilość zaalokowanej pamięci w bajtach i wypisać ją w formacie:
Memory allocated: [bytes] bytes - Obliczyć średnią wszystkich wartości i wypisać ją z dokładnością do 2 miejsc po przecinku, w formacie:
Average: [value] - 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.1Wynik powinien wyglądać tak:
Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80To 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;
}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
1Podstawy wskaźników
Czym jest wskaźnik?Deklarowanie wskaźnikówOperator pobrania adresu (&)Operator dereferencji (*)Wskaźniki NULLPodsumowanie: podstawy wskaźników4Projekt: Proste narzędzie tekstowe
Przegląd projektuLiczenie znaków2Wskaźniki i tablice
Nazwy tablic jako wskaźnikiElementy tablic — wskaźnikiArytmetyka wskaźnikówPorównywanie wskaźnikówPodsumowanie: przechodzenie po tablicy za pomocą wskaźników5Wskaźniki i funkcje
Przekazywanie przez wartośćPrzekazywanie wskaźników do funkcjiModyfikowanie zmiennych za pomocą wskaźnikówKlasyczny przykład: zamianaPrzekazywanie tablic do funkcjiPowtórka: argumenty wskaźnikowe funkcji8Struktury i wskaźniki
Wskaźniki do strukturOperator strzałki (->)Przekazywanie struktur przez wartośćPrzekazywanie wskaźników do strukturDynamiczna alokacja strukturPodsumowanie: modyfikowanie struktury — wskaźnik11Końcowe zadania powtórkowe
Powtórka: dynamiczne łączenie ciągów znakówPowtórka: tablica strukturPowtórka: licznik częstotliwości słów3Tablice znaków i ciągi znaków
Ciągi znaków jako tablice charZnak końca ciąguWczytywanie ciągu za pomocą scanfUżywanie strlen()Używanie strcpy()Używanie strcat()Używanie strcmp()Podsumowanie: podstawowe funkcje do obsługi ciągów znaków6Zarządzanie pamięcią
Pamięć stosu a stertyAlokacja dynamiczna — malloc()Użycie sizeof() do alokacjiSprawdzanie niepowodzenia alokacjiZwalnianie pamięci za pomocą free()Alokacja za pomocą calloc()Podsumowanie: tablica dynamicznaPoćwicz samodzielnie: Kompilator C online