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;
}