[C][C++] Funkcja malloc, zastosowanie w FIFO

mateuszl95
Użytkownik
Użytkownik
Posty: 97
Rejestracja: 14 paź 2009, o 20:11
Płeć: Mężczyzna
Lokalizacja: Kruszwica
Podziękował: 17 razy
Pomógł: 8 razy

[C][C++] Funkcja malloc, zastosowanie w FIFO

Post autor: mateuszl95 »

Cześć, analizowałem kod kolejki FIFO na stronie:


Jak działa funkcja malloc w tym kodzie, jak interpretować te linie kodu z funkcji push:

Kod: Zaznacz cały

nowy= (FIFO *)malloc(sizeof(FIFO));
Mam pytanie: jak krok po kroku działa ta linijka. Moja interpretacja jest taka:
1) Linijka ta przypisuje wskaźnikowi adres nowego elementu struktury FIFO
2) Linijka ta tworzy blok pamięci o rozmiarze struktury FIFO
3) Nie wiem co oznacza (FIFO *), i co by się na przykład stało gdyby tam było (int *)?
4) Skoro funkcję push można wywoływać wielokrotnie, to pod jaką nazwą występuje nowo powstały element struktury (czy wgl ma jakąś nazwę)? Czy gdyby usunąć elementy, których wskaźniki wskazują na element K, to czy element K byłby możliwy do odnalezienia?

Czy istnieje inny możliwy zapis tej linijki, który pomoże mi zrozumieć, jak działa malloc?
Ostatnio zmieniony 28 gru 2014, o 13:55 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Gouranga
Użytkownik
Użytkownik
Posty: 1592
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 246 razy

[C][C++] Funkcja malloc, zastosowanie w FIFO

Post autor: Gouranga »

(FIFO *) przed funkcją to rzutowanie jawne, zwróć uwagę, że zmienna nowy jest typu FIFO* czyli wskaźnik na FIFO, funkcja malloc z definicji jest typu void* czyli wskaźnik na typ nieokreślony, trzeba zrzutować malloc na docelowy typ żeby kompilator się nie spluwał o konflikt typów
mateuszl95
Użytkownik
Użytkownik
Posty: 97
Rejestracja: 14 paź 2009, o 20:11
Płeć: Mężczyzna
Lokalizacja: Kruszwica
Podziękował: 17 razy
Pomógł: 8 razy

[C][C++] Funkcja malloc, zastosowanie w FIFO

Post autor: mateuszl95 »

Dzięki

I jeszcze jedno pytanie: czy dwie gwiazdki przy wskaźniku są używane tylko dla estetyki? Ponieważ zaimplementowałem FIFO bez "pointerów dwugwiazdkowych" i program działa poprawnie.

Spostrzeżenie dla początkujących:

Wskaźnik zapamiętuje adres do zmiennej, a nie jej nazwę.

Zatem funkcja malloc alokuje miejsce w pamięci, które nie ma swojego nazewnictwa (określonej zmiennej) w programie. Ale można odczytać dane z tego miejsca, jeśli znamy jego adres.

W powyższym przypadku ten adres przechowuje wskaźnik o nazwie nowy.
Gouranga
Użytkownik
Użytkownik
Posty: 1592
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 246 razy

[C][C++] Funkcja malloc, zastosowanie w FIFO

Post autor: Gouranga »

wskaźnik z dwiema gwiazdkami (tzw. daleki wskaźnik) to nie kwestia estetyki, to jest wskaźnik na wskaźnik czyli wskazuje miejsce gdzie jest zapisany adres miejsca, gdzie jest zapisana wartość. A w praktyce używa się tego do tablic dwuwymiarowych.
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

[C][C++] Funkcja malloc, zastosowanie w FIFO

Post autor: Dasio11 »

W tym przypadku podwójny wskaźnik FIFO** jest użyty po to, żeby funkcja mogła zwrócić jednocześnie kilka wartości (typu FIFO*). Schematycznie działa to tak jak poniżej (tylko zamiast FIFO* jest int):

Kod: Zaznacz cały

void f( int* a, int* b )
{
    *a = 1;
    *b = 2;
}

int main()
{
    int a, b;
    f( &a, &b ); // ustawia a=1, b=2
}
Jest to wygodne, ponieważ funkcje takie jak push i pop wymagają modyfikacji wskaźników na początek i koniec kolejki, więc w ten sposób mogą jednocześnie wykonać robotę i zaktualizować oba te wskaźniki.
ODPOWIEDZ