• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dynamiczna alokacja - dodawanie i odczyt komórka po komórce

0 głosów
301 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez tirey93 Początkujący (380 p.)
   int i;
   float *top;
   top=(float *)calloc(1,sizeof(float));
   for(i=0;i<11;i++){
        *top=10-i;
        top++;
        top=(float *)calloc(1,sizeof(float));
   }
   top=top-11;//zawracanie do poczatku tablicy
   for(i=0;i<11;i++)
        printf("%f\n",top[i]);
   free(top);

Alokuję jedną komórkę do tablicy top. Następnie w pętli dodaję do niej wartość po czym przesuwam wskaźnik, alokuję następną komórkę i powtarzam do zakończenia. Po zakończeniu pętli mam tablicę n-elementową zawierającą n elementów i jedną pustą komórkę(ostatnią). Chciałbym odczytać całą tablicę jednak nie wiem jak dostać się na jej początek. W zamieszczonym kodzie próbowałem przesunąć się do początku tablicy odejmując od wskaźnika liczbę n, ale to nie zadziałało(dlaczego?). Próbowałem też deklarować sztuczny wskaźnik w którym przechowuję pierwszy adres tablicy(ten przed wykonaniem pętli). To działało lepiej, jednak efekty również nie były przewidywalne(nie czytał wszystkich komórek).

Jak więc zawrócić do początku by móc operować na tablicy? Zdaję sobie sprawę, że ten problem można rozwiązać unikając problemu - np używając statycznych tablic albo deklarując w calloc rozmiar z góry. Zależy mi jednak na kontrolowaniu wielkości tablicy w trakcie wykonywania programu.

1 odpowiedź

+1 głos
odpowiedź 15 maja 2016 przez mrcnsct Nałogowiec (36,390 p.)
wybrane 17 maja 2016 przez tirey93
 
Najlepsza

Alokujesz pamięć na jeden element. Potem wpisujesz tam wartość, przesuwasz wskaźnik i znowu alokujesz pamięć na jeden element. Do top zostanie przypisany inny adres niż ten, który był po przesunięciu (calloc zwraca wskaźnik do nowo przydzielonego bloku pamięci). Tak więc te wartości nie będą obok siebie (w sensie arytmetyki wskaźnikowej), czyli nie możesz się cofnąć top=top-11. Gdybyś po przesunięciu nie alokował pamięci tylko wpisywał wartość to program wypisze to co chcesz, bo komórki będą obok siebie, ale się wysypie, bo nie zostały zaalokowane. W C nie powinno się rzutować zwracanej wartości przez malloc, calloc, realloc https://pl.wikibooks.org/wiki/C/malloc#Uwagi. Jak chcesz zmieniać rozmiar tablicy, to użyj realloc.

Podobne pytania

0 głosów
2 odpowiedzi 1,334 wizyt
pytanie zadane 8 kwietnia 2017 w C i C++ przez Mikusbombro Użytkownik (990 p.)
0 głosów
1 odpowiedź 611 wizyt
pytanie zadane 27 września 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)
0 głosów
2 odpowiedzi 1,006 wizyt
pytanie zadane 3 maja 2016 w C i C++ przez sebask08 Użytkownik (510 p.)

93,778 zapytań

142,737 odpowiedzi

323,388 komentarzy

63,382 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...