• 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

Object Storage Arubacloud
0 głosów
136 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 582 wizyt
pytanie zadane 8 kwietnia 2017 w C i C++ przez Mikusbombro Użytkownik (990 p.)
0 głosów
1 odpowiedź 358 wizyt
pytanie zadane 27 września 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)
0 głosów
2 odpowiedzi 749 wizyt
pytanie zadane 3 maja 2016 w C i C++ przez sebask08 Użytkownik (510 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...