====== Dynamická práce s pamětí ====== * [[dox>dynamicka-prace-s-pameti/dynamicky-zasobnik.c|Dynamický_zásobník]] * [[dox>dynamicka-prace-s-pameti/spojeni-textovych-retezcu.c|Spojení_textových_řetězců]] ======Přetypování ukazatelů====== Přestože jsou ukazatele při deklaraci vztaženy ke konkrétnímu datovému typu, umožňuje jazyk C definovat také ukazatel (ukazatel na typ void), který není vázán ke konkrétnímu typu. S takovým ukazatele pak lze některé operace provádět pouze při uvedení explicitní konverze. V praxi se tyto ukazatele používají převážně při deklaracích a definicích funkcí, které pracují s daty libovolných typů. Příklad: void *moje_pamet; ((int *)moje_pamet)++; ======Funkce pro práci s pamětí====== Všechny níže uvedené funkce jsou definovány v knihovně [[:c:stdlib.h]]. Při výpočtu velikosti bloku se v praxi hojně využívá operátor [[:c:sizeof]]. Pokud není možné paměť alokovat, vrací níže uvedené funkce hodnotu NULL (ukazatel na nulovou adresu). =====malloc===== void *malloc(size_t size);\\ Funkce alokuje paměť velikosti size a vrátí ukazatel na danou oblast paměti. =====calloc===== void *calloc(size_t items, size_t size);\\ Funkce alokuje paměť pro //items// prvků o velikosti //size// (tedy items*size bytů), navíc tuto paměť vyplní nulami. =====realloc===== void *realloc(void* old, size_t size);\\ Funkce zajišťující změnu velikosti dříve alokovaného bloku paměti //old// na velikost //size//. Data původního bloku paměti budou zkopírována do nově alokovaného. =====free===== void free(void* block);\\ Funkce pro uvolnění paměti //block//. Používá se vždy, když víme, že už danou paměť nebudeme v programu používat. ======Praxe====== * neuvolňování paměti vzniká tzv. //memleak// * kontrola: statická splint, runtime: valgrind * defacto sem patří i [[:c:string.h#strdup]] ---- cc,upol