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