Dynamická alokácia pamäte a smerníky

Podobné dokumenty
Čo ak program potrebuje pamäť, ktorej veľkosť závisí od konkrétneho vstupu?

Programovanie v jazyku C - to chce dynamiku

Programovanie v jazyku C - pole treba poorat...

Úroveň strojového kódu procesor Intel Pentium. Adresovanie pamäte

Př. další použití pointerů

Operačný systém Úvodná prednáška

VECIT 2006 Tento materiál vznikol v rámci projektu, ktorý je spolufinancovaný Európskou úniou. 1/4

Funkcia - priradenie (predpis), ktoré každému prvku z množiny D priraďuje práve jeden prvok množiny H.

Studentove t-testy. Metódy riešenia matematických úloh

Programovanie v jazyku C - struktury a polia

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

Prevody z pointfree tvaru na pointwise tvar

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

Polia a matice v jazyku C. Michal Kvasnica

PODPROGRAMY. Vyčlenenie podprogramu a jeho pomenovanie robíme v deklarácii programu a aktiváciu vykonáme volaním podprogramu.

Programovanie I. Úvod do programovania Mgr. Stanislav Horal, Katedra informatiky, FPV, UCM

Objektovo orientované programovanie v C# ERIK KUČERA METÓDY VÝPOČTOVEJ INTELIGENCIE PREDNÁŠKA 3

Príklad ponuky: Riešenie: vrch. hodnota 3 hodnota 2 hodnota 1

Microsoft Outlook. Stručný prehľad základných funkcií. Ing.Anna Grejtáková, SPP DFBERG

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

IP Adresa. Marián Opiela 1.E

Základy optických systémov

Užívateľská príručka systému CEHZ. Základné zostavy Farmy podľa druhu činnosti

Pravdepodobnosť. Rozdelenia pravdepodobnosti

Jednoduchá správa pamäte

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

15. Príkazy vetvenia

Starý program Program s pointerom

Metóda vetiev a hraníc (Branch and Bound Method)

Multiplexor a demultiplexor

Algoritmizace a programování

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;

Základy programování (IZP)

Potrebujem: plastelína, tabuľa, kriedy, papieriky veľkosti A5, pastelky, ceruzky, lepiaca páska, nožnice

Súmernosti. Mgr. Zuzana Blašková, "Súmernosti" 7.ročník ZŠ. 7.ročník ZŠ. Zistili sme. Zistite, či je ľudská tvár súmerná

Moderné vzdelávanie pre vedomostnú spoločnosť/projekt je spolufinancovaný zo zdrojov EÚ. Grafy

Informatika a jej jednotlivé oblastí

Textový editor WORD. Práca s obrázkami a automatickými tvarmi vo Worde

Vzor PRÍDELOVÝ LÍSTOK KATEGÓRIE A

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

Konfigurácia IP Bell 02C Dverný vrátnik a FIBARO Home Center 2

Vysoké školy na Slovensku Prieskum verejnej mienky

ALGORITMY A PROGRAMOVANIE VO VÝVOJOVOM PROSTREDÍ LAZARUS. Vývojové prostredie Lazarus, prvý program

Inovatívna poštová schránka

VYSPORIADANIE PREHRADENÝCH ZÁVÄZKOV A POHĽADÁVOK

Strojový kód, assembler, emulátor počítača

Kvadratické funkcie, rovnice, 1

Mgr. Stanislav Fila, psychológ CPPPaP Banská Bystrica Centrum pedagogicko-psychologického poradenstva a prevencie (bývalá KPPP) Banská Bystrica

Základy algoritmizácie a programovania

ZADANIE 1. PDF vytvorené pomocou súšobnej verzie pdffactory

Používateľská príručka: MOODLE

TEÓRIA FARIEB, FAREBNÉ MODELY

Kombinatorická pravdepodobnosť (opakovanie)

Práca s elektronickou prihláškou SOČ

MATLAB (1) - úvod do programovania vedeckých problémov. LS 2017, 8.predn.

Riešené úlohy Testovania 9/ 2011

Beáta Stehlíková Časové rady, FMFI UK, 2013/2014. CvičenievR-kuI.:ARIMAmodely p.1/15

PB071 Programování v jazyce C Jaro 2015

Úrad pre dohľad nad zdravotnou starostlivosťou Žellova 2, Bratislava. Dátové rozhranie pre externý subjekt SP

MANUÁL K TVORBE CVIČENÍ NA ÚLOHY S POROZUMENÍM

Úrad pre dohľad nad zdravotnou starostlivosťou Žellova 2, Bratislava. Dátové rozhranie pre externý subjekt SP

Import cenových akcií FRESH

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

Optimik Exporter Inštalácia 1. Otvoriť stránku nabytok.com, v záložke POREZ DTD kliknúť na Stiahnuť Optimik Exporter

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

3D origami - tučniak. Postup na prípravu jednotlivých kúskov: A) nastrihanie, alebo natrhanie malých papierikov (tie budeme neskôr skladať)

Ponuka a Dopyt: Ako Fungujú Trhy

Mgr. Stanislav Fila, psychológ CPPPaP Banská Bystrica Centrum pedagogicko-psychologického poradenstva a prevencie (bývalá KPPP) Banská Bystrica

Zverejnené informácie k nevyčerpaným prostriedkom z plateného portálu.

TomTom Referenčná príručka

Súťaž Vráťme knihy do škôl je tu už po 7-krát!

PB071 Programování v jazyce C

v y d á v a m m e t o d i c k é u s m e r n e n i e:

Diplomový projekt. Detská univerzita Žilinská univerzita v Žiline Matilda Drozdová

Task, async, await METÓ DY VÝPOČTOVEJ INTELIGENCIE A C# FA K ULTA E L E K T ROTECHNIKY A INFORMATIKY S LOVENSKÁ T E CHNICKÁ U NIVERZITA

Spracovanie informácií

Návod na použitie zápisníka jedál

Súťaž Vráťme knihy do škôl je tu už po 5-krát!

Skákalka. Otvoríme si program Zoner Callisto, cesta je Programy Aplikácie Grafika Zoner Callisto.

Pozičné číselné sústavy. Dejiny. Číselná sústava je spôsob, akým sú zapisované čísla pomocou znakov (nazývaných cifry).

MEDZINÁRODNÁ ŠTÚDIA PISA 2012 RÁMEC, ÚLOHY A ANALÝZY

Bitmapové a vektorové grafické editory. Grafické editory používame na kresbu, resp. editovanie obrázkov. Obrázky sa dajú kresliť dvoma spôsobmi.

Operačná analýza 2-12

Technická univerzita v Košiciach

Ministerstvo školstva Slovenskej republiky

Finančný manažment, finančná matematika a účtovníctvo

Tipy na šetrenie elektrickej energie Použitie časového spínača Časť I Kuchynský bojler

1. Gigabajty si hneď v prvom kroku premeníme na gigabity a postupne premieňame na bity.

Začínam so zadaním z NEPOUŽÍVAME ROZSAH POKIAĽ HO MUSÍME PRESKOČIŤ

To bolo ľahké. Dokážete nakresliť kúsok od prvého stromčeka rovnaký? Asi áno, veď môžete použiť tie isté príkazy.

Kombinatorická pravdepodobnosť (opakovanie)

OBSAH. 1. Základné pojmy informatiky 2. Digitalizácia 3. Rastrová (=bitmapová) grafika. 4. Vektorová grafika

Modul PROLUC Podvojné účtovníctvo

Riešenie cvičení z 3. kapitoly

Návod na používanie súboru na vyhodnotenie testov všeobecnej pohybovej výkonnosti

Stiga Autoclip 200 Series

Nevypĺňať!!! Údaje je potrebné vyplniť prostredníctvom elektronického formulára na portalvs.sk

PB071 Programování v jazyce C Jaro 2017

Základy - prihlásenie

Virtuálna Registračná Pokladnica. Modul OPD pre ios

Transkript:

ÚINF/JAC1a (Programovací jazyk C) Dynamická alokácia pamäte a smerníky robert.novotny@upjs.sk 18. 10. 2011

Alokácia pamäte v C v C je manažovaná len staticky alokovaná pamäť t. j. pre premenné, ktorých veľkosť je známa v čase kompilácie to sa týka lokálnych i globálnych premenných int a = 3; char priezvisko[10]; povolené sú len konštanty! double priemery[] = {3.0, 2.5, 1.4, 1.0};

Alokácia pamäte v C #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc, char** argv) { } int a = 3, b = 4, c = 5; int s = (a + b + c) / 2; double obsah = sqrt(s * (s-a) * (s-b) * (s-c)); printf("%lf", obsah); return EXIT_SUCCESS; premenné a, b, c, s, obsah sú staticky alokované argc, argv zatiaľ ignorujme

Čo sa deje na pozadí? pamäť = sklad bajtov hmlistá analógia: páska Turingovho stroja každý chlievik má svoju adresu v praxi: každý bajt má svoju adresu každá premenná obsadí niekoľko chlievikov int na 32-bitovom systéme 4 bajty názov premennej je ľudské pomenovanie daného chlievika polica 2325 v sklade má nálepku KLINCE" KLINCE 3 polica 2325

Čo sa deje na pozadí? v skutočnosti dva kroky int c; int c = 3; alokuje chlievik v pamäti nazve ho c c = 3; priradí do chlievika hodnotu c 3

Dynamická alokácia mnohokrát nevieme dopredu, koľko pamäte budeme potrebovať Načítajte dva vektory ľubovoľnej dĺžky a nájdite ich súčet. Potrebná pamäť závisí od dĺžky vektora......teda od dĺžky vstupu. tú vieme zistiť až za behu Koľko pamäte budeme potrebovať?

Barbarská alokácia Načítajte dva vektory ľubovoľnej dĺžky a nájdite ich súčet. alokujeme dve obrovské polia intov! barbarské, lebo: čo keď sa do nich vstup nezmestí? nemrháme náhodou pamäťou? alokuje sa cca 24 kb pamäte! int vektor1[3000]; int vektor2[3000];

Civilizovaná dynamická alokácia vyžiadame si od operačného systému toľko pamäte, koľko treba Milý operačný systém, keďže používateľ bude zadávať päťprvkový zoznam, potrebujem od teba miesto pre pole 5 integerov. S úctou malloc() je funkcia zo stdlib.h (o jej návratovej hodnote o chvíľu) malloc(5 * sizeof(int))

Dynamická alokácia Milý operačný systém, [...] potrebujem od teba miesto pre pole 5 integerov. malloc(5 * sizeof(int)) Milá aplikácia, na základe Tvojej žiadosti som ti vyhradil miesto pre 5 integerov. Začína sa od adresy 1138. Užívaj ho s láskou a starostlivosťou. Tvoj operačný systém. malloc() vracia adresu, na ktorej sa začína alokovaný priestor

Dynamická alokácia Milá aplikácia, od adresy 1138 som ti vyhradil dostatok pamäte pre 5 integerov. malloc() vracia adresu, od ktorej sa začína alokovaný priestor adresu si poznačme do premennej premenná obsahujúca adresu pointer / ukazovateľ / smerník

Dynamická alokácia Milá aplikácia, od adresy 1138 som ti vyhradil dostatok pamäte pre 5 integerov. alokovaný priestor je určený len pre hodnoty požadovaného typu chceli sme 5 integerov, dostaneme priestor pre 5 integerov pointer je vždy spätý s konkrétnym typom indikuje povolené hodnoty, ktoré môžeme ukladať do alokovaného priestoru premenná s adresou sa vždy označuje ako pointer na [dátový typ]

Dynamická alokácia int * p_cisla; p_cisla = malloc(5 * sizeof(int)) čítame sprava doľava: p_cisla je pointer na int 1138 1142 1146 1150 1154 p_cisla int int int int int 1138 int *

V útrobách dynamickej alokácie... od adresy 1138 som ti vyhradil miesto pre 5 integerov... malloc() uvažuje v bajtoch 5 int-ov na 32/64-bitovej architektúre = 20 B ale! do 20 bajtov možno narvať kadečo 5 intov / 5 floatov / 2 doubly / 20 charov... to je dôvod, prečo hovoríme o pointeri na [dátový typ]?

Ideálna situácia s rozostupmi adresy majú rozostup v našom príklade 4 bajty int na 32/64-bitovom systéme potrebuje 4 bajty p_cisla 1138 1142 1146 1150 1154 25 13 0 5-2 int int int int int 1138 int *

Reálna situácia s rozostupmi práca s pamäťou je oveľa viac hardcore rozostupy môžu byť väčšie v závislosti: od operačného systému od architektúry: int na 16-bitoch systéme: 2 B od optimalizácie ukladania dát (memory aligment) dáta s rozostupom podľa veľkosti slova na architektúre netreba sa tým trápiť!

Načo sú nám adresy? našťastie: konkrétne čísla adries nás nemusia trápiť! je mi jedno, či pole začína od 1138 alebo od 84545 dôležité je, že mám toľko pamäte, koľko som chcel int * p_cisla = malloc(5 * sizeof(int)); char * znaky = malloc(5 * sizeof(char)); 20B 5B sizeof = vracia veľkosť pamäte potrebnej pre hodnotu dátového typu na danej architektúre unárny operátor

Malloc()nutý úsek sa správa ako pole! int * p_cisla = malloc(5 * sizeof(int)); p_cisla[0] = 25; p_cisla[1] = 13; p_cisla[2] = 0; p_cisla[3] = 5; p_cisla[4] = -2; p_cisla 1138 int * na prístup k i-temu chlieviku použime [i] 1138 1142 1146 1150 1154 25 13 0 5-2 int int int int int

Malloc()nutý úsek je pole! int * p_cisla = malloc(5 * sizeof(int)); p_cisla[5] = 666; folklórna chyba: alokujem päť prvkov a chcem pristupovať k šiestemu prvku! možno patrí cudzieho programu SEGFAULT možno je tam pamäť, v ktorej je uložený obsah nejakej inej premennej môjho programu Chyby, ktoré sa nedajú odladiť!

Susedia, tečú mi od vás dáta! pamäť je lineárna postupnosť chlievikov spomnime na pásku Turingovho stroja 1138 1142 1146 1150 1154 1158 1162 25 13 0 5-2 120 72 int int int int int int int p_cisla 1138 int * naša pamäť chlievik, kde je obsah premennej dlzka_usecky chlievik, kde je pamäť cudzieho procesu

Susedia, tečú mi od vás dáta! ak zapisujeme do p_cisla[0] až p_cisla[4], je to v poriadku 1138 1142 1146 1150 1154 1158 1162 25 13 0 5-2 120 72 int int int int int int int p_cisla 1138 int * naša pamäť chlievik, kde je obsah premennej dlzka_usecky chlievik, kde je pamäť cudzieho procesu

Susedia, tečú mi od vás dáta! zápis do p_cisla[5] znamená prepis hodnoty v premennej dlzka_usecky! program pobeží spokojne ďalej 1138 1142 1146 1150 1154 1158 1162 25 13 0 5-2 120 72 int int int int int int int Takúto chybu je prakticky nemožné odladiť! p_cisla 1138 int * naša pamäť Buffer overflow = pretečenie buffera! chlievik, kde je obsah premennej dlzka_usecky chlievik, kde je pamäť cudzieho procesu

Susedia, tečú mi od vás dáta! zápis do p_cisla[6] znamená prepis pamäte v cudzom procese program SEGFAULTne 1138 1142 1146 1150 1154 1158 1162 25 13 0 5-2 120 72 int int int int int int int Toto je pozitívny krach, lebo vieme, že niečo je zhnité. p_cisla 1138 int * naša pamäť Buffer overflow = pretečenie buffera! chlievik, kde je obsah premennej dlzka_usecky chlievik, kde je pamäť cudzieho procesu

Pohraničná kontrola Jazyk C zásadne nekontroluje medze polí! Java: ArrayIndexOutOfBoundsException výnimka pri prekročení medzí C: kontrola hraníc polí je výpočtovo náročná, preto ju necháme na programátora pozor na chybu plus jedna je mimoriadne častá sekneme sa o položku vľavo/vpravo

Zásady pre alokáciu vždy treba otestovať, či sa podarilo alokovať pamäť! int * p_cisla = malloc(5 * sizeof(int)); if(p_cisla == NULL) { } /* nedostatok pamäte, treba ukončiť program */

Zásady pre alokáciu v čerstvo alokovanej pamäti sú vždy náhodné dáta! int * p_cisla = malloc(5 * sizeof(int)); printf("%d", p_cisla[0]); vylepšenie: funkcia calloc() 2 parametre: počet prvkov, veľkosť prvku automaticky vynuluje pamäť vypíše prakticky náhodnú hodnotu int * p_cisla = calloc(5, sizeof(int));

Zásady pre dealokáciu pamäť, ktorú dynamicky alokujeme, musíme po skončení práce dealokovať! po skončení práce za sebou upraceme!" int * p_cisla = malloc(5 * sizeof(int)); /* extra zložité výpočty */ free(p_cisla); p_cisla = NULL; free() uvoľnuje pamäť

Zásady pre dealokáciu v Jave to za nás robí garbage collector školník, ktorý metlou upratuje alokovanú, ale už nepoužívanú pamäť GC = pohodlný, strašne výpočtovo náročný ak nedealokujeme dynamicky alokovanú pamäť, skôr či neskôr aplikácia zomrie na jej nedostatok operačný systém pridelí procesu 1 MB pamäte alokujem priestor na 500 x 500 int-ov, zabudnem dealokoať zvýši sa mi extrémne málo pamäte na ostatné premenné

Situácia po free() 1138 1142 1146 1150 1154 25 13 0 5-2 int int int int int p_cisla 1138 po free() už táto pamäť nie je naša! int * 1138 1142 1146 1150 1154 p_cisla 1138 int * 25 13 0 5-2 int int int int int Po free() sa pamäť vráti operačnému systému. Hodnoty sa nemusia vynulovať! Pointer začne ukazovať do cudzej pamäťe!

Silne odporúčané kombo 1. free() 2. priradenie NULL 1138 1142 1146 1150 1154 25 13 0 5-2 int int int int int p_cisla 1138 int * p_cisla NULL int * Ak chce niekto po uvoľnení pristúpiť k pamäti, program rovno spadne. Analógia NullPointerException z Javy Pointer začne ukazovať nikam"! To je dobre! Vieme, že je niečo zhnité

Sumár ak potrebujeme alokovať pamäť za behu (dynamicky), používame malloc() pristupujeme k nej pomocou pointerov dynamicky alokovaná pamäť sa správa ako pole pristupujeme indexami pozor na pretečenia! po skončení nezabudneme pamäť dealokovať!