IUJCE 07/08 Přednáška č. 6

Podobné dokumenty
Př. další použití pointerů

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

Operační systémy. Cvičení 4: Programování v C pod Unixem

Pointery II. Jan Hnilica Počítačové modelování 17

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

PB071 Programování v jazyce C Jaro 2015

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

11a Dynamické dvourozměrné pole (obdobně vícerozměrné)

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

Struktura programu v době běhu

PB071 Programování v jazyce C Jaro 2017

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Základy programování 2 KMI/ZP2

4. Typ ukazatel, strukturované datové typy

Práce s pamětí a předávání parametrů. Úvod do programování 1

Základy programování (IZP)

Ukazatele #2, dynamická alokace paměti

Programování v jazyce C pro chemiky (C2160) 11. Vizualizace sekvence proteinů

Programovanie v jazyku C - to chce dynamiku

PB071 Programování v jazyce C

ZÁKLADY PROGRAMOVÁNÍ V C

Funkce, intuitivní chápání složitosti

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Ukazatele, dynamická alokace

Operační systémy. Jednoduché stránkování. Virtuální paměť. Příklad: jednoduché stránkování. Virtuální paměť se stránkování. Memory Management Unit

Operační systémy. Přednáška 8: Správa paměti II

Správa paměti. Ing. Marek Běhálek katedra informatiky FEI VŠB-TUO A-1018 / marek.behalek@vsb.

Práce s polem a pamětí

Spojová implementace lineárních datových struktur

PB071 Principy nízkoúrovňového programování

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Správa paměti. Ing. Marek Běhálek katedra informatiky FEI VŠB-TUO A-1018 /

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

Algoritmizace a programování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Správa paměti. Správa paměti. (c)marek Běhálek, Katedra informatiky FEI VŠB-TU Ostrava 1. Motivace. Úrovně správy paměti. Obsah přednášky.

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Základní datové struktury

B4B35OSY: Operační systémy

Konstruktory a destruktory

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

09. Memory management. ZOS 2006, L.Pešička

PB161 Programování v jazyce C++ Přednáška 5

Základy programování (IZP)

Práce s řetězci. IUJCE Přednáška č. 10. string.h. vrací: délku řetězce str (bez '\0')

Programování v C++, 2. cvičení

Základy programování (IZP)

Mělká a hluboká kopie

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Přednáška. Správa paměti II. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

ZÁKLADY PROGRAMOVÁNÍ V C

PB161 Programování v jazyce C++ Přednáška 4

PB161 Programování v jazyce C++ Přednáška 4

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Algoritmizace a programování

Reprezentace dat v informačních systémech. Jaroslav Šmarda

Abstraktní třídy, polymorfní struktury

IUJCE 07/08 Přednáška č. 1

Ukazatele, paměťové třídy, volání funkcí

Implementace numerických metod v jazyce C a Python

Generické programování

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Dynamická vícerozměrná pole. Základy programování 2 Tomáš Kühr

8 Třídy, objekty, metody, předávání argumentů metod

Práce se soubory. Základy programování 2 Tomáš Kühr

PB přednáška (12. října 2015)

ADT/ADS = abstraktní datové typy / struktury

Přidělování paměti II Mgr. Josef Horálek

Programování v C++ 2, 4. cvičení

Matematika v programovacích

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

10 Práce s řetězci - pokračování

Základy C++ I. Jan Hnilica Počítačové modelování 18

Programovací jazyk C++ Cvičení 2

Lekce 19 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

Dynamická alokace paměti

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Např.: // v hlavičkovém souboru nebo na začátku // programu (pod include): typedef struct { char jmeno[20]; char prijmeni[20]; int rok_nar; } CLOVEK;

Práce se soubory. Úvod do programování 2 Tomáš Kühr

PB161 Programování v jazyce C++ Přednáška 5

PREPROCESOR POKRAČOVÁNÍ

Vícerozměrná pole. Úvod do programování 2 Tomáš Kühr

Programování v C++ 1, 1. cvičení

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Semestrální práce KIV/PC Řešení kolizí frekvencí sítě vysílačů Zdeněk Bečvář A14B0466P 10. ledna 2016

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) 28. prosince Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Základy programování (IZP)

Rozšiřování a upravování stávající funkcionality PLToolbox, Orafce

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Transkript:

Správa paměti Motivace a úvod v C (skoro vždy) ručně statické proměnné o datový typ, počet znám v době překladu o zabírají paměť po celou dobu běhu programu problém velikosti definovaných proměnných jak velké pole? Dynamické proměnné o datový typ, počet o velikost při běhu programu znám v době překladu dynamické proměnné v C výhradně přes pointery o každá dyn. proměnná musí mít svůj pointer stdlib.h funkce pro práci s dynamickými proměnnými Alokace a dealokace paměti alokace memory allocation OS programu vyhradí část volné paměti celé bezznaménkové číslo void * malloc(size_t Size) o Size = počet požadovaných Bytů o Vrací pointer na alokovaný blok (pointer na void alokace se zdařila platný pointer alokace se nezdařila (není dost paměti) NULL Dealokace (uvolnění) paměti void free(void *Memory) o Memory je pointer na uvolňovaný blok program vrací paměť zpět OS Realokace změna velikosti alokovaného bloku void *realloc(void *ptr, size_t size) nutno vždy přetypovat) o změní velikost alokované paměti v bloku ptr na size (obsah zachován) o vrací realokace OK: pointer na nový blok realokace false: NULL o nový blok > původní o nový blok < původní přidá paměť za původní (obsah náhodný) odřízne konec 1

Příklad #include <stdio.h> #include <stdlib.h> #define N 10 i např. z klávesnice double *p; p int i; // alokace p = (double *)malloc(n*sizeof(double)); if (p == NULL) return 1; // prace s polem for (i = 0; i < N; i++) p[i] = i; for (i = 0; i < N; i++) printf("%lf\n", *(p + i)); // dealokace free((void *) p); p = NULL; Poznámky: o pro jednoduché typy se dyn. alokace nevyplatí režie o alokace mnoha malých bloků = vyčerpání paměti dříve, než při alokaci jednoho velkého bloku o práce s dynamickým polem = práce se statickým pole (až na definici) Vícerozměrná dynamická pole dimenze neomezeně, dále 2D polodynamické pole = statické pole pointerů na dynamické řádky o počet řádků staticky, počet sloupců dynamicky int *ppolodynpole[radku]; for(i = 0; i < RADKU; i++) ppolodynpole[i] = (int *)malloc(sloupcu*sizeof(int)); o každý řádek může mít i jinou velikost plně dynamické pole = dynamické pole pointerů na dynamické řádky int **pdynpole; pdynpole = (int **)malloc(radku*sizeof(int *)); for(i=0; i<radku; i++) pdynpole[i] = (int *)malloc(sloupcu*sizeof(int)); Program v paměti počítače Paměť dynamické pole kontrola alokace několik segmentů (závisí na architektuře počítače a překladači) 2

o code kód vlastního programu (instrukce) o globální data všechny globální proměnné o zásobník (stack) lokální proměnné + režie funkcí o hromada (halda, heap) volná paměť pro dynamické proměnné o nějaké další MS-DOS o v paměti vždy pouze OS, ovladače a (1) program o zásobník max. 64 kb (typicky 4 kb) o heap 64 kb (cca 1x double Pole[90][90]!!!) o globální proměnné max. 64 kb o (MS-DOS + code + stack + heap + global + ovladače) < 640 kb Win32 (W95 a novější) o každý program k dispozici 4 GB (virtuální paměť) virtuální paměť = RAM + pevný disk (swap file) o zásobník = 1 MB (lze zvětšit) o (code + stack + globální data + heap) < 2GB Program a zásobník program s více funkcemi obr. obsazení zásobníku void f1(void); void f2(void); void f3(void); int mp1,mp2; // 1 f1(); // 2 f2(); // 3 f3(); // 4 // 5 void f1(void) int f1p1; void f2(void) int f2p1; f1(); void f3(void) int f3p1; 3

Dynamické proměnné a funkce Příklad heap vs. stack int *pint; // 1 pint = Alokuj(3); // po Alokuj() 4 pint[1] = 888; // 5 Tisk(pInt); free(pint); // 7 int *Alokuj(N) int *ppom; // 2 ppom = malloc(n); // 3 return ppom; void Tisk(int* pco) // printf(pco) // 6 o Obr. vždy po provedení příslušného příkazu na řádku 4

statické vs. dynamické proměnné alokované a vracené funkcí o statické na stacku nelze používat mimo funkci o dynamické na heapu lze používat mimo funkci int *AlokujPole1(void) // spatne int polestat[100]; return polestat; // compiler warning int *AlokujPole2(void) // OK int *ppom; Pom = (int *)malloc(100*sizeof(int)); return ppom; 5

Příklad Napište funkci, která alokuje paměť pro kompletně dynamické dvourozměrné zubaté pole ve tvaru dolní trojúhelníkové matice. Napište také funkci, která alokovanou paměť uvolní #include <stdio.h> #include <stdlib.h> double **AlokujMem(int N); void UvolniMem(double **pp, int N); double **TrojMatice; TrojMatice = AlokujMem(10); *(TrojMatice[3]+1) = -123.456; printf("%lf\n", *(*(TrojMatice+3)+1)); double **AlokujMem(int N) double **pppom; int i; pole[i][j] nelze řádky nemusí ležet za sebou!!! pppom = (double **)malloc(n*sizeof(double *)); if (pppom == NULL) return NULL; for (i=0; i<n; i++) pppom[i] = (double *)malloc((i+1)*sizeof(double)); if (pppom[i] == NULL) return NULL; return pppom; void UvolniMem(double **pp, int N) int i; for(i=0; i<n; i++) free((void *)pp[i]); free((void **)pp); 6

Počítání referencí vylepšené funkce pro správu paměti #include <stdlib.h> unsigned int numberofreferences = 0; void *getmem(size_t Size); void freemem(void **ppblock); globální proměnná; = počet alokací; na konci programu musí být 0 void *getmem(size_t Size) void *p; p = malloc(size); if (p!= NULL) numberofreferences++; return p; void freemem(void **ppblock) if (*ppblock!= NULL) numberofreferences--; free(*ppblock); *ppblock = NULL; ** funkce bude pointer měnit změna pointeru 7