przydzielanie pamięci funkcją malloc() w pewnej funkcji

0
 
typedef struct wezel{
   struct film pozycja;
   struct wezel* nast;
} Wezel;
typedef struct lista{
   Wezel* glowny;
   Wezel* koniec;
} Lista;
 
BOOLEAN PelnaLista(Lista l){
   Wezel* wsk;
   BOOLEAN full;

   wsk = (wezel*) malloc(sizeof(Wezel));
   if(wsk == NULL)
      full = True;
   else
      full = False;
   free(wsk);
   return full; 

To są urywki kodu pewnego programu. Pisane z palca, ale się raczej nie pomyliłem. Mam pytanie dotyczące tej funkcji. Funkcja malloc() szuka miejsca dla wskaźnika wsk. Sam dochodzę do wniosku, że malloc() szuka przestrzeni tylko w liście, ale dlaczego tak się dzieje? Może źle wnioskuję. Bo jak szuka miejsca, to dlaczego nie poszuka w pozostałej części pamięci, która jest wolna?

0

o_O w jakiej znów liście? Przecież malloc ma tylko jeden argument którym jest liczba określająca ile bajtów chcesz zarezerwować. Żadnej listy tam nie ma. Ta funkcja szuka wolnej pamięci gdzie się tylko da. Lista jest zbudowana z elementów zaalokowanych przez malloc, nie odwrotnie.
http://www.cplusplus.com/reference/cstdlib/malloc/

0

Jak zwykle nikt mnie nie rozumie, ale co tam. Chodzi o pewną strukturę danych, która się zwie lista. Link do wikipedii: http://pl.wikipedia.org/wiki/Lista Dokładniej: lista jednokierunkowa. No i mamy taką listę skonstruowaną w C. Lista to struktura, która składa się z węzłów. Węzeł to także struktura, która posiada dane oraz wskaźnik do kolejnego węzła. Na końcu listy ostatni węzeł wskazuje na NULL. Dla takiej listy i jej obsługi zostały stworzone funkcje. Jedna z funkcji sprawdza, czy dana lista jest pełna. Maksymalna długość kolejki jest z góry zdefiniowana. (Tak właściwie to jest kolejka.) Chodzi mi o sposób. Tworzy wskaźnik do węzła. Następnie za pomocą funkcji malloc szuka miejsca dla tego węzła. I tu pojawia się moje pytanie: Gdzie ta funkcja malloc szuka tego miejsca, że nie wskaże jakiegoś wolnego miejsca w pamięci, które jest dostępne, tylko sprawdza, czy w tej liście jest wolny węzeł?

2

@pasasap jak zwykle to ty nic nie rozumiesz. Wyobraź sobie że wiemy co to jest lista...
Funkcja którą pokazałeś NIE sprawdza czy lista jest pełna, tylko czy jest jeszcze dość ramu żeby dodać do tej listy kolejny element. Funkcja malloc() szuka miejsca na stercie, czyli w uproszczeniu w pamięci operacyjnej komputera. Nie ma czegoś takiego jak wolny węzeł w liście! Jak usuwasz z listy węzeł do go wyrzucasz i zwalniasz pamięć.

0

Dobra, jak zwykle namieszałem. To jest bardziej jak kolejka, która ma ograniczoną długość. Maksymalna długość wynosi 10. Jak wywołanie tej funkcji występuje, gdy kolejka jest pełna, to funkcja zwraca True, a jest to efektem tego, że wsk wskazuje na NULL, co jest warunkiem. A przecież w pamięci operacyjnej jest gdzieś jeszcze wolne miejsce. No i tu to moje pytanie: dlaczego tak się dzieje?

1

Nie dzieje się. A już na pewno nie w tym kodzie który pokazałeś. No chyba że ktoś ma tam własną implementację malloc() która dokonuje takich cudów na kiju, ale wątpię.

2

Jest pewna różnica pomiędzy listą a kolejką lista to sposób implementacji, zaś kolejka to pewne zagadnienie abstrakcyjne które może być zrealizowane za pomocą kolejki.
Kolejka może być również zrealizowana poprzez taką oto strukturę:
struct Kolejka { struct film tablica[10]; int Zarezerwowano; };
Kolejka zrealizowana w ten sposób będzie przepełniona po 10-tym elemencie.
Natomiast kolejka zrealizowana za pomocą listy jednokierunkowej może być przepełniona dopiero jak się skończy wirtualna pula adresów (w praktyce więcej niż zmieści pamięć fizyczna komputera).

0

Jednak moje pytanie nie dotyczy tego, jak zrobić czy co to jest kolejka, lista, lecz dlaczego funkcja sprawdza czy kolejka (lista?) jest pełna poprzez funkcję malloc? Bo dobrze przecież piszecie i ja też tak myślę, że powinno wskazać jakieś miejsce dowolne dostępne w pamięci, lecz jeśli w tej kolejce jest już 10 węzłów, to funkcja zwraca True, czyli że nie znalazło dostępnego miejsca dla nowego węzła. Jak zwykle ja myślę o jednym, a wy odpowiadacie na inne pytanie lub problem.

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