IB001 – Seminární skupiny 16, 17, 18 a 19
Dynamická alokácia pamäte
#include<stdio.h>
#include<stdlib.h>
/* Program nacita od uzivatele cisla a uklada si je do pole, pole
* zvysuje vzdy po 3, aby funkci realloc nevolala tak casto (v realu
* se samozrejme pouzivaji vetsinou vyssi hodnoty pro tento rozestup,
* resp. se zvysuji s tim, jak roste pocet prvku v poli).
*
* Pokud funkce realloc selze, puvodni pole necha byt, proto jeji
* vysledek ukladame napred do tmpPole a nikoli do pole. Puvodni
* cast je treba v tomto pripade uvolnit. Pokud funkce neselze
* a je-li treba pole presunout jinam, kde je misto pro jeho vetsi
* variantu, jsou vsechny prvky preneseny a puvodni pole uvolneno.
*
* Konec "souboru" zpusobite pri zadávání z klavesnice, když
* na novem radku (po ENTER) "CTRL+D" pod
* unix-like, resp. "CTRL+Z" pod MS-like systemy.
*/
int main(void) {
int pocet = 0, maxPocet = 3; // aktuelni pocet prvku, maximalni pocet prvku bez nove alokace
int *pole = (int*)malloc(maxPocet*sizeof(int)); // pole
int *tmpPole; // pomocny ukazatel pro zjisteni vysledku realloc
if (pole == NULL) { // inicialni test, zda se podarila alokace
fprintf(stderr, "Nedostatek pameti!\n");
return 1;
}
printf("Zadavej cisla, ja si je budu pamatovat, pak je vypisi ven:\n");
while(1 == scanf("%d", &pole[pocet])) { // dokud uzivatel zadava cisla
++pocet; // zvysime pocet aktualniho poctu prvku
if (maxPocet - pocet == 0) { // pokud jiz je treba zvetsit velikost pole
maxPocet += 3; // zvysime maximalni pocet prvku v poli
if ((tmpPole = (int*)realloc(pole, maxPocet*sizeof(int))) == NULL) { // zkusime zvetsit
fprintf(stderr, "Nedostatek pameti, jiz nemuzeme nacitast, vypisi, co mam!\n");
break; // pokud se nepodari, ukoncime cyklus a vypiseme, co mame
} else
pole = tmpPole; // pokud se podari, ukazujeme jiz na "vetsi" pole
}
}
for (int i = 0; i < pocet; ++i) // vypiseme vsechny cisla, ktera jsme zvladli nacist
printf("%d, ", pole[i]);
printf("\n");
free(pole); // uvolnime pole
return 0;
}