C/Wskaźniki: Różnice pomiędzy wersjami

Usunięte 1134 bajty ,  5 lat temu
BDGHFHGFJMGH
(zbędne spacje, usunięcie interwiki - teraz na Wikidanych, drobne poprawki techniczne)
Znacznik: edytor kodu źródłowego 2017
(BDGHFHGFJMGH)
Mając styczność z tablicami można się zastanowić, czy nie dałoby się mieć tablic, których rozmiar dostosowuje się do naszych potrzeb a nie jest na stałe zaszyty w kodzie programu. Chcąc pomieścić więcej danych możemy po prostu zwiększyć rozmiar tablicy - ale gdy do przechowania będzie mniej elementów okaże się, że marnujemy pamięć. Język C umożliwia dzięki wskaźnikom i dynamicznej alokacji pamięci tworzenie tablic takiej wielkości, jakiej akurat potrzebujemy.
 
HGBY87YYUY9YYB
=== O co chodzi ===
BRGHHYUFOSDUHDSOHGGHFSHOUSDGHSGOUHGOSIDFGODIGODSUGSJOFGIUSGIOSUGIOSUGHSGUOSUGSDHIOGSHGUOGHOFGU
Czym jest dynamiczna alokacja pamięci? Normalnie zmienne programu przechowywane są na tzw. '''stosie (ang. ''stack'')''' - powstają, gdy program wchodzi do bloku, w którym zmienne są zadeklarowane a zwalniane w momencie, kiedy program opuszcza ten blok. Jeśli deklarujemy tak tablice, to ich rozmiar musi być znany w momencie kompilacji - żeby kompilator wygenerował kod rezerwujący odpowiednią ilość pamięci.
HGIDSFKSDHFUHSDFUYSDFHUSDFSDFUSDD DMUOHFNUOFHONGJSOFWQDAHGCAGDGTBG
 
DDHHDVBDVSDHISDHIUFHFHFIUHFHFIUSDFHSUIFHUHUISDHFISHSHDIUHFIUSDHIU
Dostępny jest jednak drugi rodzaj rezerwacji (czyli alokacji) pamięci. Jest to alokacja na '''stercie (ang. ''heap'')'''. Sterta to obszar pamięci wspólny dla całego programu, przechowywane są w nim zmienne, których czas życia nie jest związany z poszczególnymi blokami. Musimy sami rezerwować dla nich miejsce i to miejsce zwalniać, ale dzięki temu możemy to zrobić w dowolnym momencie działania programu.
GDAYGDBHHJJHDSVUHSJDSHHJ
 
GSGCYGZCHSODIOA
Należy pamiętać, że rezerwowanie i zwalnianie pamięci na stercie zajmuje więcej czasu niż analogiczne działania na stosie. Dodatkowo, zmienna zajmuje na stercie więcej miejsca niż na stosie - sterta utrzymuje specjalną strukturę, w której trzymane są wolne partie (może to być np. ''lista''). Tak więc używajmy dynamicznej alokacji tam, gdzie jest potrzebna - dla danych, których rozmiaru nie jesteśmy w stanie przewidzieć na etapie kompilacji lub ich żywotność ma być niezwiązana z blokiem, w którym zostały zaalokowane.
 
=== Obsługa pamięci ===
Anonimowy użytkownik