Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).



Podobne dokumenty
Podstawy programowania komputerów

DYNAMICZNE PRZYDZIELANIE PAMIECI

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Stałe, tablice dynamiczne i wielowymiarowe

Programowanie w języku C++

Podstawy programowania w języku C++

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Wskaźniki. Informatyka

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

ZASADY PROGRAMOWANIA KOMPUTERÓW

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Wskaźniki w C. Anna Gogolińska

4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu.

Lab 9 Podstawy Programowania

KURS C/C++ WYKŁAD 6. Wskaźniki

Język ANSI C tablice wielowymiarowe

Język ANSI C. część 11. Jarosław Gramacki Instytut Informatyki i Elektroniki

Języki i metodyka programowania. Wskaźniki i tablice.

Tablice, funkcje - wprowadzenie

//zmienne globalne int *pa, *pb; //wskaźniki globalne void main(void) { clrscr(); printf("\n podaj wartosc liczby a\n"); scanf("%d",&a); pa=&a;

Wskaźniki. Programowanie Proceduralne 1

Uzupełnienie dot. przekazywania argumentów

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Wykład 1: Wskaźniki i zmienne dynamiczne

Spis treści JĘZYK C - WSKAŹNIKI, DYNAMICZNY PRZYDZIAŁ PAMIĘCI. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Podstawy programowania w języku C++

Wskaźniki. Przemysław Gawroński D-10, p Wykład 1. (Wykład 1) Wskaźniki / 9

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Adam Kotynia, Łukasz Kowalczyk

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )

Programowanie obiektowe W3

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Języki programowania obiektowego Nieobiektowe elementy języka C++

dr inż. Paweł Myszkowski Wykład nr 8 ( )

Powyższe wyrażenie alokuje 200 lub 400 w zależności od rozmiaru int w danym systemie. Wskaźnik wskazuje na adres pierwszego bajtu pamięci.

Wstęp do programowania

Podstawy Programowania 2 Wskaźniki i zmienne dynamiczne. Plan. Wskaźniki - krótka powtórka. Wskaźniki - krótka powtórka Wartości wskaźników.

Struktury czyli rekordy w C/C++

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Temat: Dynamiczne liniowe struktury danych - stos, kolejka, lista. 1. Wady i zalety struktury tablicy

. Podstawy Programowania 2. Wskaźniki i zmienne dynamiczne. Arkadiusz Chrobot. 25 lutego 2019

Zmienne i struktury dynamiczne

Tablice, funkcje, wskaźniki - wprowadzenie

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Wstęp do wskaźników i dynamicznej alokacji pamięci w językach ANSI C i C++

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Jak Windows zarządza pamięcią?

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Podstawy informatyki. Wykład nr 1 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Podstawy Programowania

Podstawy Programowania

Podstawy programowania w języku C++

Informatyka. Wy-03 Dynamiczna alokacja pamięci, wyjątki. mgr inż. Krzysztof Kołodziejczyk

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Podstawy Programowania. Zmienne dynamiczne, struktury, moduły programowe

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

Podstawy Programowania. Zmienne dynamiczne, struktury, moduły programowe

Programowanie i struktury danych

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

Wstęp do wskaźników w języku ANSI C

Struktury. Przykład W8_1

Języki i metody programowania I

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

Kompilator języka C na procesor 8051 RC51 implementacja

Ghost in the machine

nowe operatory &. (kropka) * operator rzutowy ->, (przecinek) sizeof

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Wymiar musi być wyrażeniem stałym typu całkowitego, tzn. takim, które może obliczyć kompilator. Przykłady:

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Bardzo szybkie podsumowanie: wykład 3

Stałe i zmienne znakowe. Stała znakowa: znak

tablica: dane_liczbowe

Programowanie obiektowe w C++ Wykład 1

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Tbli Tablice obiektów biktó są tworzone dokładnie d tak samo, jak i tablice, składające się z elementów innego typu

Podstawy programowania 1

zmienne stanowią abstrakcję komórek pamięci: programista może przechowywać dane w pamięci, nie martwiąc się o techniczne szczegóły (np.

Zarządzanie pamięcią

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

Język C zajęcia nr 11. Funkcje

Transkrypt:

Zarządzanie pamięcią Pamięć: stos i sterta Statyczny i dynamiczny przydział pamięci Funkcje ANSI C do zarządzania pamięcią Przykłady: Dynamiczna tablica jednowymiarowa Dynamiczna tablica dwuwymiarowa 154

Co to jest stos? Stos (ang. stack) to obszar pamięci w przestrzeni adresowej programu wykorzystywany do specyficznych celów. Stos obsługiwany jest w sposób automatyczny, obsługa ta nie wymaga ingerencji programisty. Na stosie dostępny jest wyłącznie element położony na jego wierzchołku, a elementy zdejmowane są ze stosu w odwrotnej kolejności niż były na nim umieszczane (rejestr LIFO). Na stosie przechowywane są: zmienne lokalne; argumenty wywołania funkcji; wartość zwracana przez funkcję; adres wywołania funkcji (miejsce w kodzie); 155

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom). Na stercie przechowywane są: dynamicznie tworzone struktury danych; dynamicznie przydzielane obszary pamięci; 156

Statyczny przydział pamięci Rezerwowanie obszaru pamięci w momencie kompilacji kodu źródłowego. ZALETY: łatwa obsługa statycznych obszarów pamięci; prosty zapis w kodzie źródłowym; WADY: konieczność przydzielania pamięci na wyrost w przypadku gdy rozmiar potrzebnej pamięci jest zmienny (nieoszczędne wykorzystanie pamięci); pamięć przydzielona statycznie jest zwalniana dopiero w momencie zakończenia działania programu; 157

Dynamiczny przydział pamięci Rezerwowanie obszaru pamięci w trakcie działania programu. ZALETY: możliwość elastycznego określania zapotrzebowania na pamięć w programie; wykorzystywany jest obszar pamięci o takim rozmiarze, jaki w danym momencie jest wymagany (oszczędne wykorzystanie pamięci); możliwość zwolnienia niewykorzystywanej już pamięci; WADY: niebezpieczeństwo wystąpienia fragmentacji pamięci (używane obszary przeplatają się z nieużywanymi); niebezpieczeństwo wystąpienia efektu przeciekania pamięci (przy braku zwalniania pamięci); 158

Statycznie i dynamicznie const int N = 100; float a[n]; Rozmiar tablicy a został określony w momencie kompilacji kodu źródłowego. float *wsk; int n = 100; wsk = (float *) malloc(n*sizeof(float)); Rozmiar tablicy został określony w momencie działania programu. 159

Funkcje ANSI C do zarządzania 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() 160

Funkcje ANSI C do zarządzania pamięcią PRZYDZIELANIE PAMIĘCI (ALOKACJA) void *malloc(size_t size); wskaźnik nieokreślony rozmiar całego obszaru w bajtach PRZYKŁAD: adres zarezerwowanego obszaru pamięci rzutowanie typu int *wsk; wsk = (int *) malloc(10*sizeof(int)); if (wsk == NULL) { czy wskaźnik pusty? printf( Brak pamieci ); exit(1); } KOMÓRKI PAMIĘCI MAJĄ PRZYPADKOWE WARTOŚCI. 161

Funkcje ANSI C do zarządzania pamięcią PRZYDZIELANIE PAMIĘCI Z INICJALIZACJĄ void *calloc(size_t n, size_t size); wskaźnik nieokreślony liczba elementów rozmiar pojedynczego elementu PRZYKŁAD: int *wsk; wsk = (int *) calloc(10, sizeof(int)); KOMÓRKI PAMIĘCI ZOSTAJĄ WYZEROWANE. 162

Funkcje ANSI C do zarządzania pamięcią ZMIANA ROZMIARU PRZYDZIELONEJ PAMIĘCI void *realloc(void *p, size_t size); Zmiana rozmiaru obszaru pamięci już zaalokowanego dynamicznie i wskazywanego przez p na wartość size. Gdy nowy rozmiar jest większy od poprzedniego, wszystkie dane zawarte w obszarze p pozostają niezmienione. PRZYKŁAD: int *wsk; wsk = (int *) malloc(10*sizeof(int)); wsk = (int *) realloc(wsk, 20*sizeof(int)); realloc(wsk, 0); free(wsk); 163

Funkcje ANSI C do zarządzania pamięcią ZWALNIANIE PAMIĘCI (DEALOKACJA) void free(void *p); PRZYKŁAD: int *wsk; wsk = (int *) malloc(10*sizeof(int));... free(wsk); zwolnienie obszaru pamięci wskazywanego przez wsk Nie ma ograniczeń co do kolejności zwalniania obszarów pamięci. NIE WOLNO zwalniać obszarów nie przydzielonych wcześniej funkcjami malloc, calloc, realloc. NIE WOLNO używać obszaru już zwolnionego. Zwalnianie pustego wskaźnika (NULL) nie jest błędem. 164

Dynamiczna tablica jednowymiarowa #include <stdio.h> #include <stdlib.h> float *wsk; int i, n; int main() { printf( Podaj liczbe elementow: ); scanf( %d, &n); wsk = (float *) malloc (n*sizeof(float)); if (wsk == NULL) return -1; for (i = 0; i < n; i++) wsk[i] = i; /* *(wsk+i) = i; */ free(wsk); return 0; } 165

Dynamiczna tablica dwuwymiarowa #include <stdio.h> #include <stdlib.h> float **wsk; int i, j, m, n; int main() { printf( Podaj liczbe wierszy i kolumn: ); scanf( %d %d, &m, &n); wsk = (float **) malloc(m*sizeof(float *)); if (wsk == NULL) return -1; for (i = 0; i < m; i++) wsk[i] = (float *) malloc(n*sizeof(float));... 166

Dynamiczna tablica dwuwymiarowa c.d. }... for (i = 0; i < m; i++) free(wsk[i]); free(wsk); return 0; 167