Portál AbcLinuxu, 17. července 2025 12:23


Dotaz: C - dynamicka alokace pole

15.7.2014 19:31 Lada
C - dynamicka alokace pole
Přečteno: 350×
Odpovědět | Admin
Jak v C spravne naalokovat trirozmerne dynamicke pole? Ucim se z Herouta, prvni dil mam za sebou a pustil jsem se do druheho ale toto mi stale neni jasne, neni to tam tak uplne vysvetlene. Priklad: chci trirozmerne pole s X, Y, Z rozmery, typu int. Zajimala by me jednak sturktura "pole pointeru" a tez "pointer na pointer". Pokud mozno i testem prideleni s naslednym uvolnenim pameti, mam v tom trochu gulas. Diky za pomoc, Lada

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

15.7.2014 20:40 pou | skóre: 18
Rozbalit Rozbalit vše Re: C - dynamicka alokace pole
Odpovědět | | Sbalit | Link | Blokovat | Admin

Dělal bych to asi tak to:

 

int len_a;
int len_b;
int len_c;

int ***p;
p=malloc(len_a*sizeof(**int));
for(int i=0;i<len_a;i++){
p[i]=malloc(len_b*sizeof(*int));
for(int j=0;j<len_b;j++)
p[i][j]=malloc(len_c*sizeof(int));
}

16.7.2014 13:06 lertimir | skóre: 64 | blog: Par_slov
Rozbalit Rozbalit vše Re: C - dynamicka alokace pole
Ten zápis je opravdu korektní alokace pro 3D pole, ale jak už tady psali, rozumnější je udělat něco jako:
int len_a;
int len_b;
int len_c;

int *p2;

p2=malloc(len_a*len_b*len_c*sizeof(int));
a potom k prvku a,b,c se přistupuje p2[a*len_b*len_c+b*len_c+c]

má to tu výhodu, že jsou data kompaktně naalokována. A alokace paměťového bloku od systému je obecně dost pomalá operace. Na druhou stranu v případě, že se intenzívně pracuje přes indexy a a b může mít výhodu ten standardní přístup, protože k prvku pole se přistupuje přes dvakrát pointer a 3x sčítání a není tam násobení. Ten standardní přístup se sem přídá tím, že naalokuji ještě.

int ***p, **p1;
p=malloc(len_a*sizeof(**int));
p1=malloc(len_a*len_b*sizeof(*int));
for(int i=0;i<len_a;i++){
  p[i]=p1+i*len_b;
  for(int j=0;j<len_b;j++){
    p1[j+i*len_b]=p2+(i*len_b+j)*len_c;
  }
}
A pak je p2 pole dat, poskládané tak, že c prvek je nejrychlejší, p1 pole pointrů na data, každý pointr ukazuje na prvek s nulovým c indexem, p pole pointrů do pole pointrů, každý pointr ukazuje na pointr, který směřuje na prvek s nulovou hodnotou indexu b.
Josef Kufner avatar 15.7.2014 20:54 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: C - dynamicka alokace pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vícerozměrná pole v C jsou tak trošku iluze. Nejlepší je spočítat si velikost potřebného bloku paměti a alokovat si ho najednou. K přístupu pak použít mapovací makro či funkci, která přepočítá 3D souřadnice na 1D.
Hello world ! Segmentation fault (core dumped)
15.7.2014 22:26 Petr | skóre: 29
Rozbalit Rozbalit vše Re: C - dynamicka alokace pole
"Nejlepší je spočítat si velikost potřebného bloku paměti a alokovat si ho najednou." a neslouzi k tomu prave funkce malloc?
Josef Kufner avatar 15.7.2014 22:32 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: C - dynamicka alokace pole
Slouží. A jejím parametrem je velikost paměti v bytech, což je to, co si má spočítat.
Hello world ! Segmentation fault (core dumped)
15.7.2014 22:34 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: C - dynamicka alokace pole
Myslel tím, aby se ta funkce malloc() nevolala v cyklu tolikrát, ale jen jednou.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Josef Kufner avatar 15.7.2014 22:34 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: C - dynamicka alokace pole
Přesně tak.
Hello world ! Segmentation fault (core dumped)
15.7.2014 22:37 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: C - dynamicka alokace pole
Slouží k té druhé části, k té první se může hodit operátor sizeof ;-)
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
15.7.2014 22:46 MadCatX
Rozbalit Rozbalit vše Re: C - dynamicka alokace pole
To samozřejmě slouží, ale než volat malloc() veletucetkrát ze dvou vnořených cyklů je lepší udělat malloc(sizeof(my_type_t) * x * y * z).

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.