pamięć dynamiczna

0

no mam małe pytanko. Jak chcę robić sobie dynamicznie tablicę zmiennych do 6 elementów to oki. Ale jak chce potem powiększyć tą tablicę np do 10 elementów.
To sobie robie tak, że daję znów pELEMENTY = new int[10]; - i w tym momencie traci mi dane z poprzedniej 6 elementowej tablicy. Mogę to obejść tak że sobie najpierw skopiuje tą poprzednią i potem odkopiuje (nie najlepszy pomysł), lub że skopiuje sobie tylko adres tego pierwszego wskażnika do 6 elementowej, a gdy juz zrobie ta 0- elementowa to oddam jej adres tego pomocniczego wskaznika.
I teraz pytani czy nie istnieje obawa ze zgubie te swoje dane kiedyś, bo jak po zrobieniu etj 10-elementowej tablicy i po oddaniu jej wskaznika do 6elementowej i gdy chcę zmieniać wartości na elementach 7, 8, 9 to one już mają przyporządkowaną wartość, jakąś inną nie żadne -8945454
Jak można to robić jeszcze w innny sposób, zwiększyć wielkość dynamicznie utworzonej tablicy

int *pCh, *temp;
pCh=new int[6];

pCh[0]=3;
pCh[1]=4;
pCh[2]=5;
pCh[3]=4;
pCh[4]=4;

temp = pCh;
pCh=new int[10];
pCh=temp;

pCh[6]=4;
pCh[7]=6;

0

[code]int *pCh, *temp;
pCh=new int[6];

pCh[0]=3;
pCh[1]=4;
pCh[2]=5;
pCh[3]=4;
pCh[4]=4;

temp = pCh;
pCh=new int[10];
pCh=temp;

pCh[6]=4;
pCh[7]=6;[/code]
Nie możesz tak zrobić . Tutaj :
temp = pCh;
pCh=new int[10];
pCh=temp;
najpierw pod temp wpisujesz stary adres tej 6-cio elementowej tablicy . Potem pod pCh alokujesz 40 bajtów pamięci , czyli pod pCh przypisujesz adres gdzie zaczyna sie te 40 bajtów zaalokowanej pamięci , a potem nadpisujesz ten adres tym starym , co w konsekwencji prowadzi do tego , że "gubisz" te zarezerwowane 40 bajtów i już praktycznie nigdy ich nie odzyskasz . Te dwie linijki :
pCh=new int[6];
pCh=new int[10];
pod pCh przypisują inne obszary pamięci o innych adresach , więc nie można robić tak jak to robisz .
Ja bym to zrobił tak :
[code]
int *pCh, *temp;
pCh=new int[6];
pCh[0]=3;
pCh[1]=4;
pCh[2]=5;
pCh[3]=4;
pCh[4]=4;
temp = pCh;
pCh=new int[10];
for(int i=0;i

0

czyli podsumowując w pewnym momencie mamy w pamięci 2*tablicę 6 elementową+ 4elementy z 10elementowej . Myślałem, że da się tego jakoś uniknąć. Bo jeśli robię sobie tą 10-elementową to muszę jeszcze trzymać w pamięci 6-elementową, nie mogę jej zwolnić przed utworzeniem 10-elementowej bo wtedy stracę dane. Szkoda.
pozdro

0

nie wiem jak w C++, ale w ANSI C to bedzie tak:

int pCh;
pCH = (int
)malloc(6*sizeof(int)) ;

pCH[0]=1;
.....
pCH[5]=5;

pCH = (int*)realloc( (int*)pCH, sizeof(int)*10); //skopiuje wszystkie elementy i powiekszy rozmiar tablicy

ps. jak sie pomylilem to prosze poprawic :-)

0

Qrde G-r-e-g . Masz racje ... Nie wiedziałem , że tak można [glowa] . Ale fakt , kiedyś nawet chyba obiła mi sie o oczy ta funkcja jak przeglądałem helpa ... Ale nigdy z niej nie korzystałem . Fajna sprawa . Rozumiem , że jak realloc zwróci inny adres , tzn , że zaczynając od starego wskaźnika już więcej sie nie da zalokować , to pamięć od starego wskaźnika jest zwalniana ??

0

właśnie ... jak to jest. pamięć "starego" wskaźnika jest zwalniana czy nie ? w opisie tej funkcji pisze że w pewnych przypadkach funkcja ta zachowuje się dokładnie jak malloc ... a po mallocu trzeba przeciez pamięć zwlaniać ... to jak jast z realloc'iem ?

0

właśnie ... jak to jest. pamięć "starego" wskaźnika jest zwalniana czy nie ? w opisie tej funkcji pisze że w pewnych przypadkach funkcja ta zachowuje się dokładnie jak malloc ... a po mallocu trzeba przeciez pamięć zwlaniać ... to jak jast z realloc'iem ?

Pamięć starego wskaźnika , w przypadku gdy od niego nie można było zaalokować żądanej liczby bajtów musi być zwalniana , to by było bez sensu . A do tego:
The realloc function changes the size of an allocated memory block. The memblock argument points to the beginning of the memory block. If memblock is NULL, realloc behaves the same way as malloc and allocates a new block of size bytes. If memblock is not NULL, it should be a pointer returned by a previous call to calloc, malloc, or realloc.
Czyli realloc zachowa się jak malloc w przypadku gdy jako argument poda się mu wskaźnik NULL .

0

Ponieważ nie napisałeś pod czym kompilujesz to podam ci rozwiązanie pod Buildera 5. wystarczy skorzystać w nim z gotowej template Vector. Jest to własnie dynamiczna tablica. Mozesz dopisywać w niej elementy na końcu itd. dokładny opis w Helpie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1