Kerhon jäsenrekisterissä käytettiin osoitintaulukkoa dynaamisesti. Vastaavan rakenteen tarve tulee usein ohjelmoinnissa. Tällöin tulee aina vastaan ongelma: montako alkiota taulukossa on nyt ja montako sinne mahtuu? Jäsenrekisterissä tämä oli ratkaistu cJasenet- luokassa tekemällä sinne kentät, joista nämä rajat selviävät.
Tavallinen taulukkokin voidaan usein esitellä vastaavasti
typedef struct { int max_koko; int lkm; int *alkiot; } Taulukko_tyyppi; ... Taulukko_tyyppi luvut; luvut.max_koko = 7; luvut.alkiot = calloc(7,sizeof(luvut.alkiot[0])); luvut.alkiot[0] = 0; luvut.alkiot[1] = 2; luvut.lkm = 2; Taulukko_tyyppi luvut +-----+ max_koko | 7 | 0 1 2 3 4 5 6 lkm | 2 | +--------------------+ *alkiot | o--+------>| 0| 2| ?| ?| ?| ?| ?| +-----+ +--------------------+
Tällaisen taulukon kuljettaminen parametrinä on helppoa, kun se voidaan välittää vain yhtenä parametrinä.
Viittausten puolesta samanlainen vastaava staattinen esittely olisi:
typedef struct { int max_koko; int lkm; int alkiot[7]; } Taulukko_tyyppiS; ... Taulukko_tyyppiS luvut = { 7, 2, {0,2} }; Taulukko_tyyppiS luvut +-----+ max_koko | 7 | lkm | 2 | +-----+--------------+ alkiot | 0| 2| ?| ?| ?| ?| ?| +--------------------+ 0 1 2 3 4 5 6
Staattisessa esittelyssä taulukko tulisi tietueen osaksi. Kuitenkin kummassakin tapauksessa viitataan taulukon yksittäiseen alkioon muodossa luvut.alkiot[3]=5;.
Staattisen esittelyn "hyvä" puoli olisi siinä, että tällainen taulukko voitaisiin sijoittaa toiseen taulukon yhdellä käskyllä:
Taulukko_tyyppiS apu,luvut = { 7, 2, {0,2} }; apu = luvut;
Tietysti sijoitus onnistuu dynaamisessakin tapauksessa, mutta tulos saattaa olla muuta kuin on haluttu! Miksi?
Viimeksi esiteltyä staattistakin esittelyä voidaan käsitellä dynaamisesti luomalla muuttujat luvut dynaamisesti. Koska C- kielessä ei useinkaan ole indeksitarkistusta, niin luomisessa malloc - funktiolle voidaan "valehdella" alkion koko:
Taulukko_tyyppiS *luvut; ... luvut = malloc( sizeof(Taulukko_tyyppiS) + 4*sizeof(int) ); luvut- >max_koko = 7 + 4; ...
Tosin koko taulukon sijoittaminen yhdellä käskyllä ei enää onnistu tämän tempun jälkeen! Miksi?