IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – 2. diel - Dynamická alokácia pamäte v jazyku C

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
David.Landa
Člen
Avatar
David.Landa:3.2.2015 11:13

Proč provádíš type cast zde: (int *) malloc(sizeof(int) * 100);?

 
Odpovedať
3.2.2015 11:13
Avatar
emedla
Člen
Avatar
emedla:15.4.2015 21:05

Co přesně znamená ta část: (int *), viděl jsem to aji někde jako parametr funkce.

 
Odpovedať
15.4.2015 21:05
Avatar
tomisoka
Tvůrce
Avatar
Odpovedá na emedla
tomisoka:15.4.2015 21:31

Přetypování.

(int *)malloc(...);

malloc vrací "void*" ale je potřeba "int*".

 
Odpovedať
15.4.2015 21:31
Avatar
David Novák
Tvůrce
Avatar
Odpovedá na emedla
David Novák:15.4.2015 21:37

Tím řekneš překladači, na jaký datový typ (reálně na kolik bajtů) ukazatel ukazuje. Tzn. když máš ukazatel na int, tak ukazuje na nějaké místo do paměti a v tom místě začíná integer - typicky 4 bajty.

Když bys to nezadal, tak to nebude vědět, s kolika bajty tam má pracovat :)

Odpovedať
15.4.2015 21:37
Chyba je mezi klávesnicí a židlí.
Avatar
emedla
Člen
Avatar
Odpovedá na David Novák
emedla:16.4.2015 11:56

Aha, ok, takže je to přetypování z void na int. Takže přetypovávám ukazatele na nějakou adresu.
A je nějakej důvod proč to nevypadá takto: (*int), ale takto: (int *) ? Nebo to prostě tak je?

 
Odpovedať
16.4.2015 11:56
Avatar
David Novák
Tvůrce
Avatar
Odpovedá na emedla
David Novák:16.4.2015 12:14

No.. prostě to tak je :)

Když definuješ samotný datový typ, tak je to stejné - int *ukazatel.. Tím získáš proměnnou "ukazatel", která je ukazatel na typ int.

K té první části. Ne. Nepřetypováváš na adresu. Ta je stejná.. malloc ti vrací adresu.. Pouze říkáš překladači, na co chceš ukazovat. Kdybys to neudělal, tak tam bude ta samá adresa, ale překladač nebude vědět, co dělat, když mu řekneš p_i++;

Normálně by to k adrese přičetlo příslušný počet bajtů, takhle to nebude fungovat.

Odpovedať
16.4.2015 12:14
Chyba je mezi klávesnicí a židlí.
Avatar
mnauik
Člen
Avatar
mnauik:19.5.2015 13:01

Ahoj, lze zjistit, zda jsem např. na konci programu uvolnil všechnu paměť?

Odpovedať
19.5.2015 13:01
minusuj mě, ale zdůvodni to ;)
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovedá na mnauik
Martin Dráb:19.5.2015 13:39

Ahoj, lze zjistit, zda jsem např. na konci programu uvolnil všechnu paměť?

Nemyslím, že na to existuje nějaký způsob "už od výrobce". Ale celkem snadno si tuto funkcionalitu můžeš přidat. Stačí si napsat vlastní vezri alokační a dealokační funkce (malloc a free), přičemž rozdíly budou následující:

  1. alokační funkce zajistí alokaci nového bloku (např. přes výchozí malloc a informaci o této alokaci někam zapíše),
  2. dealokační funkce uvolní zadaný blok (klidně pomocí výchozího free) a odstraní informaci o tom, že byl blok alokovaný (tuto informaci ukládala alokační funkce).

Alokované bloky můžeš například řetězit do nějaké datové struktury. Jelikož detekovat neuvolněnou paměť budeš potřebovat hlavně při ladění programu, vystačíš si se spojovým seznamem (je to pomalé, ale to nikoho při ladění obvykle netíží). Přičemž budeš možná u každého bloku potřebovat prostor, abys jej mohl do té datové struktury zařadit (ale záleží na implementaci). To nevadí, protože můžeš alokovat větší blok, než volající požaduje (standardní alokátor to taky tak dělá) a předstírat, že jsi alokoval přesně tolik, kolik bylo požadováno.

Pokud bys chtěl něco lepšího než jen tuto detekci úniků paměti, lze pomocí vlastních alokačních funkcí a případných maker dosáhnout ještě následujícího:

* při reportování nedealokovaného bloku se dozvíš, v jaké funkci, v jakém souboru zdrojáku a na jakém jeho řádku byl tento blok alokován,
* detekuješ pokus o uvolňění bloku, který alokován vůbec nebyl,
* zjistíš, zda nedochází k přetečení (či "podtečení") bloku, když do něj někdo ukládá data (alokuješ větší blok, než je potřeba, a na jeho začátek a konec strčíš nějakou signaturu, kterou čas od času kontroluješ).

Což mi připomíná, že bych na toto téma mohl i někdy něco napsat, když už tyto typy alokátorů používám v podstatě pořád :-).

Pokud vím, existují i speciální alokátory, které dělají +- to, co jsem tu popsal. A určitě i něco navíc.

Odpovedať
19.5.2015 13:39
2 + 2 = 5 for extremely large values of 2
Avatar
coells
Tvůrce
Avatar
Odpovedá na Martin Dráb
coells:19.5.2015 13:56

V debug režimu už to dělá samotný malloc/free, nemusíš vynalézat kolo.

 
Odpovedať
19.5.2015 13:56
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovedá na coells
Martin Dráb:19.5.2015 17:34

V debug režimu už to dělá samotný malloc/free, nemusíš vynalézat kolo.

To asi záleží na konkrétní implementaci (překladači). U *NIXu jsem to viděl a i MSVS lze k něčemu podobnému donutit za pár řádků kódu.

Odpovedať
19.5.2015 17:34
2 + 2 = 5 for extremely large values of 2
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!