9. Ukazovatele a polia

9.4 Pole meniace svoju veľkosť

Občas sa môže vyskytnúť situácia, že v programe potrebujeme zrazu väčšie pole ako sme pôvodne predpokladali. To však vďaka dynamickým poliam nie je žiadny problém!
 
Majme program, kde využívame pole, ktoré má 10 prvkov. V priebehu výpočtu by sme zistili, že potrebujeme toto pole o 20 prvkov zväčšiť, takže pole bude mať spolu 30 prvkov. Pomôžeme si malým trikom. Alokujeme pole požadovanej veľkosti, pôvodné pole doň prekopírujeme a „staré“ pole uvoľníme pomocou funkcie free. Napíšeme len tie časti programu, o ktorých sme práve hovorili:

void main(void)
{
	int *x;
	int *p1, *p2, *p_nove; span class=kom>/* pomocné pointery */
	int pocet;  /* počet prvkov poľa *//* pocet == 10 */
	x = (int*)malloc(pocet * sizeof(int)); span class=kom>/* dynamické pole */
	…
	p_nove = (int*)malloc((pocet + 20)*sizeof(int));
	p1 = x; p2 = p_nove;
	while (p1 < x + pocet)) {
	*p2++ = *p1++;
/* alebo postupne: *p2 = *p1; p2 = p2 + 1; p1 = p1 + 1; */ } pocet += 20; free((void*)x); x = p_nove; … }

 Kopírovanie starého poľa je časovo náročné, takže v konkrétnom programe si vždy musíme premyslieť, čo je pre nás výhodnejšie – rýchlosť alebo šetrenie pamäťou. V štandardnej knižnici  stdlib.h  tiež nájdeme funkciu, ktorú môžeme využiť, ak pracujeme s poľom premenlivej dĺžky. Je to funkcia realloc s funkčným prototypom:
 
void *realloc(void *pole, unsigned int velkost);
 
kde pole je pointer na pôvodné pole, a velkost je počet bajtov nového poľa. Funkcia vráti pointer na nové pole (už zmenšené alebo zväčšené) alebo NULL v prípade neúspechu.