Podstawy programowan..
Transkrypt
Podstawy programowan..
Podstawy programowania 1 Krzysztof Grudzień [email protected] Wykład nr 4 1 Plan wykładu • Alokacja pamięci • Typy danych – Struktura – Unia – Pole bitowe • Praca z plikiem binarnym 2 Dynamiczna alokacja pamięci • zmienne programu przechowywane są na tzw. stosie (ang. stack) • drugi rodzaj rezerwacji (czyli alokacji) pamięci alokacja na stercie (ang. heap). 3 Dane na stosie • 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. 4 stos • Jeśli deklarujemy tak tablice, to ich rozmiar musi być znany w momencie kompilacji - żeby kompilator wygenerował kod rezerwujący odpowiednią ilość pamięci. 5 sterta • 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. 6 • Musimy sami rezerwować dla nich miejsce i to miejsce zwalniać, ale dzięki temu możemy to zrobić w dowolnym momencie działania programu. 7 Stos - Sterta • rezerwowanie i zwalnianie pamięci na stercie zajmuje więcej czasu niż analogiczne działania na stosie. • 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). 8 malloc/calloc int rozmiar; float *tablica; rozmiar = 3; tablica = (float*) malloc(rozmiar * sizeof (int)); tablica[0] = 0.1; 9 Funkcje do dynamicznego przydzielenia pamięci • przydzielanie pamięci (alokacja): malloc() • alokacja pamięci z inicjalizacją: calloc() • zmiana rozmiaru przydzielonej pamięci (realokacja): realloc() • zwalnianie pamięci (dealokacja): free() 10 void *malloc(size_t size); • Zwraca wskaźnik na typ pusty dlatego rzutowanie • Argument – liczba bajtów do rezerwacji • int *wsk; • wsk = (int *) malloc(20*sizeof(int)); • jeśli wsk==NULL problem przy alokacji 11 void *calloc(size_t n, size_t size); • Zwraca wskaźnik na typ pusty dlatego rzutowanie • argumenty: liczba elementów, rozmiar pojedynczego elementu • wsk = (int *) calloc(20, sizeof(int)); • jeśli wsk==NULL problem przy alokacji • ZERUJE ELEMENTY 12 void *realloc(void *ptr, size_t size); • Zmiana rozmiaru obszaru pamięci już wskazywanego przez wskaźnik ptr • Funkcja przenosi zawartość pamięci do nowej lokalizacji – wskazywanej przez wskaźnik zwracany przez funkcję • Argumenty: wskaźnik na stary obszar, rozmiar nowego obszaru 13 Przykład http://www.cplusplus.com/reference/cstdlib/realloc/ • #include <stdio.h> • #include <stdlib.h> /* printf, scanf, puts */ /* realloc, free, exit, NULL */ 14 • • • • • • int main () { int input,n; int count = 0; int* numbers = NULL; int* more_numbers = NULL; 15 • do { • printf ("Enter an integer value (0 to end): "); • scanf ("%d", &input); • count++; • more_numbers = (int*) realloc (numbers, count * sizeof(int)); • if (more_numbers!=NULL) { • numbers=more_numbers; • numbers[count-1]=input; • } • else { • free (numbers); • puts ("Error (re)allocating memory"); • exit (1); • } • } while (input!=0); 16 • printf ("Numbers entered: "); • for (n=0;n<count;n++) printf ("%d ",numbers[n]); • free (numbers); • return 0; •} 17 18 void free(void *ptr); • Zwalnia pamięć – zapobiega wyciekom pamięci • zwalnianie obszarów nie BŁĄD przydzielonych wcześniej funkcjami malloc, calloc, realloc • używanie obszaru już zwolnionego. BŁĄD 19 20