Tak si prave ctu knizku od Herouta: Pavel Herout - Ucebnice jazyka C (z roku 1994) a zda se, ze jednim z reseni je opravdu toto:
Pouzil jsem dynamicky pole a zda se ze funguje
void vymaz_ch(char **pch) {
int i, j;
for (i = 0; i < 100; i++) {
for (j = 0; j < 50; j++) {
pch[i][j] = 0;
}
}
return 0;
}
int main(void) {
char **ch;
int vyska = 100, delka = 50,a,b;
ch = (char **)malloc(vyska*(sizeof(char *)));
for(a=0;a<vyska;a++)
{
ch[a]=(char *)malloc(delka*(sizeof(char)));
}
vymaz_ch(ch);
return 0;
}
Ma to vyhodu v tom, ze si muzu dynamicky menit delku kazde vysky (po uprave kodu). Ale ma to jednu nevyhodu. Protoze podle toho, co pise Herout, tak se jednotlive radky dvourozmerneho pole nemusi alokovat v pameti hned za sebou (a zpravidla se tak opravdu nealokuji), takze je pak treba problem v tom, kdyz pristupuji na pole pomoci preteceni indexu. Takze napriklad, kdyz pouziji toto:
pch[0][51] = 1;
tak vlastne prakticky v realu zpravidla nezmenim hodnotu na pch[1][0] = 1 , ale zmenim nejakou pamet, ktera je alokovana pro neco jineho.
Druha nevyhoda tohoto reseni, jak pise Herout, je ta, ze kod je pak pomalejsi nez jine reseni, jako je napriklad reseni pomoci jednorozmerneho pole, jako je treba toto (a jak pise take Martingt89):
3) Urobis si jedno linearne pole dlzky 100*256 a sam si don budes vypocitavat vektor ako pole(i*100+j). Usetris aj na pameti, ale nebude to take pekne.
Tohle reseni ma zase tu nevyhodu, ze musi byt staticke, coz znamena vedet rozmery pole pri prekladu. Mozna by pak pomohlo dynamicky alokovat jednorozmerne pole, tedy asi takto (pokud se nepletu):
#include <stdlib.h>
void vymaz_ch(char *pch, int vyska, int delka) {
int i, j;
for (i = 0; i < vyska; i++) {
for (j = 0; j < delka; j++) {
pch[i * delka + j] = 0;
}
}
}
int main(void) {
char *ch;
int vyska = 100, delka = 50;
ch = (char *) malloc(vyska * sizeof(char) * delka);
vymaz_ch(ch, vyska, delka);
return 0;
}
A to by snad melo byt rychlejsi nez alokovat dvourozmerne pole. Ma to zase tu vyhodu (mozna jenom pseudovyhodu), ze je pamet alokovana jako jeden celek, to znamena vysky hned za sebou, i kdyz asi nemuzeme pouzit indexy pro dvourozmerne pole jako pch[0][51]. To by asi neslo. A ma to zase tu nevyhodu, ze velikost delky musi byt pro kazdou vysku stejna. To by slo zase po uprave kodu zmenit, ze bysme meli ruznou delku pro kazdou vysku, ale pak by se to asi muselo resit treba novym polem pointeru, ktere by ukazovaly na zacatek kazde vysky. A tim bysme se vlastne dostali k one alokaci pameti pro dvojrozmerne pole. Tezko rict, ktere reseni by pak bezelo rychleji.