• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
153 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 794 wizyt
pytanie zadane 8 kwietnia 2017 w C i C++ przez Mikusbombro Użytkownik (990 p.)
0 głosów
1 odpowiedź 430 wizyt
pytanie zadane 27 września 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)
0 głosów
2 odpowiedzi 812 wizyt
pytanie zadane 3 maja 2016 w C i C++ przez sebask08 Użytkownik (510 p.)

93,101 zapytań

142,066 odpowiedzi

321,526 komentarzy

62,442 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...