Ero sivun ”C” versioiden välillä

Poistettu sisältö Lisätty sisältö
Tronic (keskustelu | muokkaukset)
Kirjoitettu moniulotteiset taulukot uusiksi, koska alkuperäinen oli virheellinen.
Tronic (keskustelu | muokkaukset)
Rivi 391:
==== Dynaamiset ====
 
Pointteritaulukko on huomattavasti staattista taulukkoa joustavampi ratkaisu, mutta myös merkittävästi hankalampi luoda. Taulukko ei myöskään tuhoudu automaattisesti lohkon päätteeksi, vaan se täytyy itse vapauttaa. Staattisesta moniulotteisesta taulukosta poiketen, pointteritaulukko voidaan helposti välittää funktion argumenttina, tietämättä sen kokoa ennalta. Seuraavassa esimerkki täysin dynaamisesta moniulotteisesta taulukosta:
 
#include <stdio.h>
// Varataan ulommaisin taulukko (ensimmäinen indeksi), sisältää pointtereita sisätaulukoihin
#include <stdlib.h>
int** taulukko = malloc(3 * sizeof(int*));
}
for (size_t i = 0; i < 3; ++i) {
void print(int** taulukkoarray, size_t dim1, size_t dim2) {
// Varataan sisätaulukko (toinen indeksi), sisältää numeroita
taulukko[for (size_t i] = malloc(40; *i sizeof(int))< dim1; ++i) {
for (size_t j = 0; j < dim2; ++j) printf("%d ", taulukkoarray[i][j]);
// Alustetaan taulukon solut vastaavilla arvoilla kuin staattisella taulukolla edellä
putchar('\n');
for (size_t j = 0; j < 4; ++j) taulukko[i][j] = (i + 1) * 10 + j + 1;
}
}
/* ... Käytetään taulukkoa ... */
// Vapautetaan taulukolle varattu muisti
for (size_t i = 0; i < 3; ++i) free(taulukko[i]);
free(taulukko);
taulukko = NULL; // Jottei vahingossa käytettäisi jo vapautettua muistia
int** array_construct(size_t dim1, size_t dim2) {
Edellä olevassa esimerkkikoodissa mallocin paluuarvoja ei tarkistettu, mutta oikeassa koodissa pitää aina mallocin kutsumisen jälkeen tarkistaa palauttiko kutsu NULL:n ja suorittaa vaadittavat siivoustoimenpiteet (esim. jo varatun muistin vapautus).
// Varataan ulommaisin taulukko (ensimmäinen indeksi), sisältää pointtereita sisätaulukoihin
int** taulukkoarray = malloc(3dim1 * sizeof(int*));
for (size_t i = 0; i < 3dim1; ++i) {
// Varataan sisätaulukko (toinen indeksi), sisältää numeroita
array[i] = malloc(dim2 * sizeof(int));
// Alustetaan taulukon solut vastaavilla arvoilla kuin staattisella taulukolla edellä
for (size_t j = 0; j < 4dim2; ++j) taulukkoarray[i][j] = (i + 1) * 10 + j + 1;
}
}
void array_destruct(int** array) {
for (size_t i = 0; i < 3; ++i) free(taulukkoarray[i]);
free(array);
}
int main(void) {
int** array = array_construct(3, 4);
// ...
print(array, 3, 4);
// Kerrotaan oikeassa alakulmassa olevan alkion arvo sadalla:
array[2][3] *= 100;
// ...
// Vapautetaan taulukolle varattu muisti
array_destruct(array);
taulukko array = NULL; // Jottei vahingossa käytettäisi jo vapautettua muistia
// ...
}
Edellä olevassa esimerkkikoodissa mallocin paluuarvoja ei tarkistettu, mutta oikeassa koodissa pitää aina mallocin kutsumisen jälkeen tarkistaa palauttiko kutsu NULL:n ja tällöin suorittaa vaadittavat siivoustoimenpiteet (esim. jo varatun muistin vapautus) ennen funktiosta poistumista.
 
Täysin dynaamisessa pointteritaulukossa rivien ei tarvitse olla yhtä pitkiä, eli loopin sisällä oltaisiin voitu tehdä malloc((i + 1) * sizeof(int)), jolloin ensimmäisellä rivillä olisi yksi alkio, toisella kaksi, jne. Rivien kokoa voi muuttaa (realloc) ilman että muulle taulukossa olevalle tiedolle tarvitsee tehdä mitään ja myös rivien lisäys ja poisto hoituu kevyesti rivipointtereita siirtelemällä (sisällä olevaa tietoa ei tarvitse siirtää esim. lisättäessä uusi rivi taulukon alkuun).
Rivi 418 ⟶ 443:
 
Edellisessä esimerkikssä taulukko t olisi yhtä hyvin voinut olla staattinen kaksiulotteinen taulukko, koska sellaisen sisäinen rakenne on identtinen yksiulotteisen taulukon kanssa.
 
Staattisesta moniulotteisesta taulukosta poiketen, mikä tahansa pointteritaulukko voidaan helposti välittää funktion argumenttina, tietämättä sen kokoa ennalta:
 
void print(int** taulukko, size_t dim1, size_t dim2) {
for (size_t i = 0; i < dim1; ++i) {
for (size_t j = 0; j < dim2; ++j) printf("%d ", taulukko[i][j]);
putchar('\n');
}
}
 
== Merkkijonot ==
Noudettu kohteesta ”https://fi.wikibooks.org/wiki/C