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.
|