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;  /* pomocné pointery */
   int pocet;  /* počet prvkov poľa */
   ...
   /* pocet == 10 */ 
   x = (int*)malloc(pocet*sizeof(int));  /* 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&nbspvelkost 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.