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