Archief - [PROG][C] Kan iemand mij dynamische allocatie bij meerdimensionale tabellen uitleggen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Da nemesis

Legacy Member
Den dinsdag ist voor mij exaam c en kheb wel wat problemen met pointers en dynamische allocatie.
We hebben enkel een cursus die door de docent zelf is gemaakt en kvin ni echt dat die voldoende uitleg geeft.

Ik raak hier nogal vlug bij in de war, met een pointer-to-pointer-to-char enzo:x.

Ik vind het vooral ingewikkeld als men 3-dimensionale(en verder) tabellen begint te alloceren:sad: .


Greetz

wlibaers

Legacy Member
http://c-faq.com/index.html

Voor jou zal vooral vraag 6.16 (in "6. Arrays and Pointers") nuttig zijn, maar alles van die site kan nuttig zijn om misverstanden te corrigeren. Je moet wel wat basiskennis van C hebben.

killgore

Legacy Member
je moet gewoon zien:
a[5]; -> a zelf is een pointer naar een plaats waar men 5 variabelen heeft opgeslagen. Dus moet je gewoon malloc(5*sizeof(uwtype)) doen om een plaats te vinden waar 5 variabelen na elkaar kunnen worden opgeslagen.
a[5][5] -> a wijst nu naar een plaats waar 5 pointer variabelen (adressen) zijn opgeslagen, die op hun beurt wijzen naar 5 plaatsen waar 5 gewone variabelen zijn opgeslagen. uw allocatie wordt dus eerst malloc(5*sizeof(uwtype*)) en dan 5x (via for lus) malloc(5*sizeof(uwtype)). Dus eerst zoek je een plaats waar 5 pointers na elkaar kunnen worden opgeslagen, dan nog eens 5 plaatsen waar 5 gewone variabelen na elkaar kunnen worden opgeslagen.
a[5][5][5]-> a wijst naar 5 pointers, die wijzen elk weer naar 5 pointers, die wijzen dan elk weer naar 5 variabelen. dus:
malloc(5*sizeof(uwtype**)), dan 5x: malloc(5*sizeof(uwtype*)), dan 25x: malloc(5*sizeof(uwtype)). Hier zoek je dus weer eerst naar een plaats waar 5 pointers kunnen worden opgeslagen, dan naar 5 plaatsen waar 5 pointers kunnen worden opgeslagen, en dan uiteindelijk naar 25 plaatsen in het geheugen waar 5 variabelen kunnen worden opgeslagen :).

en zo gaat het maar door :). Goed te onthouden is dat hierin dus elk blokje van 5 wel samenhangt, maar niet alles na elkaar, bv. in het laatste: a[5][5][5]: dit kan dus 5^3=125 variabelen bevatten, maar deze zullen zich uiteindelijk allemaal per blokjes van 5 bevinden, en niet allemaal na elkaar in het geheugen!

als je dan bv. a[2][3][4] hebt heb je eerst een blokje van 2 pointers, dan 2 blokjes van 3 pointers = 6 pointers, en dan 6 blokjes van 4 variabelen :).

hopelijk hielp dit beetje ;). Nu ga ik me beetje proberen storten op wiskundige analyse 1 :sad:

Da nemesis

Legacy Member
Ow man, das al een pak beter uitgelegd dan in onze curus:eek: !
Zalig man:p , tnx!

killgore

Legacy Member
Da nemesis zei:
Ow man, das al een pak beter uitgelegd dan in onze curus:eek: !
Zalig man:p , tnx!
khoop nu alleen dak geen fouten gemaakt heb, het switchen tussen java en c/c++ kan nogal gevaarlijk zijn van tijd :p. Ma zover ek lees is alles in orde :). (natuurlijk de implentatie moet je nog zelf doen, maar dit is het gedacht erachter).

steinerwarrior

Legacy Member
Koop gewoon een deftig nederlands boek over C (bv. "De Programmeertaal C, vierde editie" van Al Kelley, Ira Pohl ISBN :90-430-0497-9)

White Label

Legacy Member
a[5][5][5]-> a wijst naar 5 pointers, die wijzen elk weer naar 5 pointers, die wijzen dan elk weer naar 5 variabelen. dus:
malloc(5*sizeof(uwtype**)), dan 5x: malloc(5*sizeof(uwtype*)), dan 25x: malloc(5*sizeof(uwtype)). Hier zoek je dus weer eerst naar een plaats waar 5 pointers kunnen worden opgeslagen, dan naar 5 plaatsen waar 5 pointers kunnen worden opgeslagen, en dan uiteindelijk naar 25 plaatsen in het geheugen waar 5 variabelen kunnen worden opgeslagen :).

QUOTE]

Waarom 25x en niet gewoon 5x?

@ Nemesis: dries ge moet wel leren ipv op forums zitten he :naughty:

White Label

Legacy Member
killgore zei:
a[5][5][5]-> a wijst naar 5 pointers, die wijzen elk weer naar 5 pointers, die wijzen dan elk weer naar 5 variabelen. dus:
malloc(5*sizeof(uwtype**)), dan 5x: malloc(5*sizeof(uwtype*)), dan 25x: malloc(5*sizeof(uwtype)). Hier zoek je dus weer eerst naar een plaats waar 5 pointers kunnen worden opgeslagen, dan naar 5 plaatsen waar 5 pointers kunnen worden opgeslagen, en dan uiteindelijk naar 25 plaatsen in het geheugen waar 5 variabelen kunnen worden opgeslagen :).

Waarom 25x en niet gewoon malloc(5*sizeof(uwtype))?

@ Nemesis: dries ge moet wel leren ipv op forums zitten he :naughty:

killgore

Legacy Member
White Label zei:
Waarom 25x en niet gewoon malloc(5*sizeof(uwtype))?

@ Nemesis: dries ge moet wel leren ipv op forums zitten he :naughty:
ge doet niet 25*malloc he :p

ge zet dat in loop.

en waarom niet malloc(5*25*sizeof()) -> gaat ook, maar dan ga je veel sneller een fout krijgen omdat dit een groter geheugenblok is, en je moet nog steeds loopen om elk blokje van 5 variabelen toe te kennen aan 1 van je vorige indices.

dit zou dan zoiets zijn:
int test[5][5][5];
//neem aan dat we de eerste indices al zoals boven besproken geïnitialiseerd
int* pointer = malloc(5*25*sizeof(int));
for(int i=0; i<5; i++)
for(int j=0; j<5; j++)
{
test[j]=(pointer+5*(i*5+j));
}
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan