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

Dodane 1134 bajty ,  6 lat temu
m
Wycofano edycje użytkownika 78.154.84.134 (dyskusja). Autor przywróconej wersji to Wargo.
BDGHFHGFJMGH
m Wycofano edycje użytkownika 78.154.84.134 (dyskusja). Autor przywróconej wersji to Wargo.
Linia 207:
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.
 
=== O co chodzi ===
HGBY87YYUY9YYB
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.
BRGHHYUFOSDUHDSOHGGHFSHOUSDGHSGOUHGOSIDFGODIGODSUGSJOFGIUSGIOSUGIOSUGHSGUOSUGSDHIOGSHGUOGHOFGU
 
HGIDSFKSDHFUHSDFUYSDFHUSDFSDFUSDD DMUOHFNUOFHONGJSOFWQDAHGCAGDGTBG
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.
DDHHDVBDVSDHISDHIUFHFHFIUHFHFIUSDFHSUIFHUHUISDHFISHSHDIUHFIUSDHIU
 
GDAYGDBHHJJHDSVUHSJDSHHJ
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.
GSGCYGZCHSODIOA
 
=== Obsługa pamięci ===