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

Usunięta treść Dodana treść
Linia 214:
 
=== Obsługa pamięci ===
Podstawową funkcją do '''rezerwacji pamięci''' jest funkcja [[C/malloc|malloc]]. Jest to niezbyt skomplikowana funkcja - podając jej rozmiar (w bajtach) potrzebnej pamięci, dostajemy wskaźnik do zaalokowanego obszaru.
 
Załóżmy, że chcemy stworzyć tablicę liczb typu float:
Linia 241:
 
Jeśli dany obszar pamięci nie będzie już nam więcej potrzebny powinniśmy go zwolnić, aby system operacyjny mógł go przydzielić innym potrzebującym procesom.
 
Do zwolnienia obszaru pamięci używamy funkcji <tt>[[C/free|free()]]</tt>, która przyjmuje tylko jeden argument - wskaźnik, który otrzymaliśmy w wyniku działania funkcji <tt>malloc()</tt>.
 
'''Do zwolnienia obszaru pamięci''' używamy funkcji <tt>[[C/free|free()]]</tt>, która przyjmuje tylko jeden argument - wskaźnik, który otrzymaliśmy w wyniku działania funkcji <tt>malloc()</tt>.
<syntaxhighlight lang="C">
free (tablica);
Linia 250 ⟶ 252:
Należy też uważać, by nie zwalniać dwa razy tego samego miejsca. Po wywołaniu free wskaźnik nie zmienia wartości, pamięć wskazywana przez niego może też nie od razu ulec zmianie. Czasem możemy więc korzystać ze wskaźnika (zwłaszcza czytać) po wywołaniu free nie orientując się, że robimy coś źle - i w pewnym momencie dostać komunikat o nieprawidłowym dostępie do pamięci. Z tego powodu zaraz po wywołaniu funkcji free można przypisać wskaźnikowi wartość 0.
 
Czasami możemy potrzebować '''zmienić rozmiar już przydzielonego bloku pamięci'''. Tu z pomocą przychodzi funkcja [[C/realloc|realloc]]:
<syntaxhighlight lang="C">
tablica = realloc(tablica, 2*rozmiar*sizeof(*tablica));
Linia 268 ⟶ 270:
tablica[0] = 0.1;
</syntaxhighlight>
 
 
'''Inicjalizacja dynamicznej tablicy'''<ref>[https://stackoverflow.com/questions/17937623/initializing-c-dynamic-arrays stackoverflow question: initializing-c-dynamic-arrays]</ref>
 
memset (data, 0.0f , sizeof (float ) * rozmiar);
 
== Możliwe deklaracje wskaźników ==