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 poprawneTo 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.
Wyzwanie
ŁatwyNapisz program w C, który demonstruje prawidłowe użycie sizeof() z malloc() do dynamicznej alokacji pamięci. Twój program powinien:
- Odczytać od użytkownika liczbę całkowitą
n, określającą liczbę elementów do zaalokowania - Użyć
malloc()zsizeof(), aby dynamicznie zaalokować pamięć na tablicęnwartości typu double - Rzutować zwrócony wskaźnik void na wskaźnik do double
- Odczytać od użytkownika
nwartości typu double i zapisać je w zaalokowanej tablicy - Obliczyć całkowitą ilość zaalokowanej pamięci w bajtach i wypisać ją w formacie:
Memory allocated: [bytes] bytes - Obliczyć i wypisać średnią wszystkich wartości z dokładnością do 2 miejsc po przecinku w formacie:
Average: [value] - 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.1Oczekiwane dane wyjściowe:
Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80To 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;
}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