Programowanie C

JAK KORZYSTAĆ Z FUNKCJI MALLOC W C?

JAK KORZYSTAĆ Z FUNKCJI MALLOC W C?
Malloc to wbudowana funkcja zadeklarowana w pliku nagłówkowym . Malloc to krótka nazwa „alokacji pamięci” i służy do dynamicznego przydzielania pojedynczego dużego bloku pamięci ciągłej zgodnie z określonym rozmiarem. Istnieją dwa rodzaje alokacji pamięci: statyczny i dynamiczny. Statyczna alokacja pamięci odbywa się w czasie kompilacji i nie zmienia się w czasie wykonywania. Dynamiczna alokacja pamięci to alokacja pamięci w czasie wykonywania; używamy malloc. Teraz chodzi o to, skąd pochodzi ta pamięć, więc wszystkie dynamiczne wymagania w C są spełnione z pamięci sterty. Zasadniczo nasza aplikacja/program będzie miał 3 rodzaje pamięci

  • Pamięć stosu jest lokalna dla każdej metody, a gdy metoda powraca, stos automatycznie ją czyści.
  • Globalny obszar pamięci alokuje pamięć dla wszystkich zmiennych globalnych. Ten obszar pamięci jest tworzony na początku programu, a na końcu automatycznie czyści obszar pamięci.
  • Pamięć sterty jest zawsze wrogiem spełniającym wszystkie dynamiczne wymagania programu/aplikacji. Za każdym razem, gdy zamierzamy użyć funkcji malloc, pożyczy ona trochę pamięci ze sterty i poda nam do niej wskaźnik.

Składnia:

Składnia malloc to (void*)malloc(size_t size). Tak więc składnia mówi, że malloc wymaga rozmiaru, zwróci wskaźnik w zasadzie pusty wskaźnik, a rozmiar t jest zdefiniowany w jako liczba całkowita bez znaku. Funkcja Malloc po prostu alokuje blok pamięci zgodnie z rozmiarem określonym w stercie, jak widać w składni, że rozmiar musi być określony, a po sukcesie zwraca wskaźnik wskazujący na pierwszy bajt przydzielonej pamięci, w przeciwnym razie zwraca NULL. Tak więc zadaniem malloc jest przydzielanie pamięci w czasie wykonywania.

Dlaczego pusty wskaźnik:

Malloc nie ma pojęcia, na co wskazuje; oznacza to po prostu, że nie wie, jakie dane będą przechowywane w tej lokalizacji pamięci. Po prostu przydziela pamięć żądaną przez użytkownika, nie znając typu danych, które mają być przechowywane w pamięci. Dlatego zwraca wskaźnik void.

Malloc po prostu alokuje pamięć, po czym użytkownik jest odpowiedzialny za rzutowanie typu na odpowiedni typ, aby można go było prawidłowo używać w programie. Void pointer to wskaźnik, który może wskazywać dowolny typ danych malloc zwraca void pointer, ponieważ nie wie, jaki typ danych będzie przechowywany w tej pamięci.

Tutaj prosimy malloc o przydzielenie 6 bajtów pamięci teraz, jeśli odniesie sukces, malloc zwróci wskaźnik void. W takim przypadku musimy rzutować go na wskaźnik typu integer, ponieważ chcemy przechowywać liczbę całkowitą w tej pamięci. Tutaj malloc alokuje 6 bajtów pamięci w stercie, a adres pierwszego bajtu jest przechowywany we wskaźniku ptr.

Przykładowy program:

Oto prosty przykładowy program, aby we właściwy sposób zrozumieć pojęcie malloc.

Tutaj możesz zobaczyć, że za pomocą funkcji printf proszę użytkownika o podanie liczby liczb całkowitych. Zadeklarowaliśmy dwie zmienne powyżej i oraz n. Zmienna n to miejsce, w którym będziemy przechowywać wpisany przez użytkownika numer. Następnie mamy funkcję malloc; chcemy, aby malloc przydzielił rozmiar odpowiadający rozmiarowi n liczb całkowitych. Mnożymy rozmiar jeśli int przez n; to da nam rozmiar n liczb całkowitych. Następnie malloc zwróci wskaźnik void, a my rzutujemy go na wskaźnik będący liczbą całkowitą, a adres przechowujemy we wskaźniku ptr. Typecasting jest ważny, ponieważ jest to dobra praktyka.

Teraz, jeśli wskaźnik zawiera NULL, oznacza to, że pamięć jest niedostępna. Więc po prostu wyjdziemy z programu ze statusem błędu wyjścia. Jeśli tak nie jest, możemy łatwo uruchomić pętlę for.

Pętla będzie przebiegać od 0 do n-1 i za każdym razem poprosimy użytkownika o wpisanie liczby całkowitej po kolei. W funkcji scanf jest jedna rzecz napisana ptr+i, ponieważ wiemy, że ptr zawiera adres pierwszego bajtu pamięci. Powiedzmy, że adres to 1000 tutaj i jest początkowo równe zero, więc 1000+0 to 1000, więc w tym adresie nasza pierwsza liczba całkowita będzie przechowywana, a potem, gdy ja zmieni się na 1, więc 1000+1, co zostało wewnętrznie zinterpretowane jako (1000) +1 *4 jeśli założę, że liczba całkowita to 4 bajty i będzie równa 1004, więc następna liczba całkowita będzie przechowywana w lokalizacji 1004. I tak będzie dalej, adresy są takie jak 1000, 1004, 1008 i tak dalej. Nie używamy znaku ampersand przed ptr+i, ponieważ ptr już podaje nam adres, gdy piszemy ptr, który jest po prostu wskaźnikiem i zawiera adres, a nie wartość, więc nie ma potrzeby umieszczania przed nim znaku ampersand, a ta koncepcja powinna być jasna.

Tutaj, w tej pętli, robimy po prostu jedną rzecz, wypisujemy wszystkie liczby całkowite na ekranie; oczywiście używamy ptr+i, ale tutaj, w tym przypadku, wyłuskujemy go, ponieważ ptr+i reprezentuje adres, więc musimy go wyłuskać. Jeśli i równa się 0, będzie to 1000, ponieważ zakładamy, że pierwszy adres będzie równy 1000, więc wyłuskujemy go; otrzymamy pierwszą liczbę całkowitą, a następnie i równą 1, i będzie to 1001, ale zinterpretowane jako 1004, jeśli liczba całkowita wynosi 4. Jeszcze raz. Wyłuskujemy to, więc da nam to 2znaleźć liczba całkowita. W ten sposób wszystko działa.

Jest to więc w zasadzie prosty program, który prosi użytkowników o wprowadzenie n liczby całkowitej, a następnie po prostu wyświetlamy te liczby na ekranie. Po uruchomieniu programu wyświetli się.

Najpierw prosimy użytkownika o podanie liczby liczb całkowitych, a następnie wprowadzamy liczby całkowite, a my po prostu wyświetlamy je na ekranie.

Wniosek:

W powyższym programie nie ma nic złego, o ile kontynuujemy go bardzo długo, tutaj pożyczamy pamięć ze sterty, ale nigdy nie zwracamy pamięci z powrotem na stertę, dzieje się to tylko w przypadku, gdy program/aplikacja ma biegać przez długi czas, np. 24 godziny. Będą ponownie wywoływać funkcję malloc, i znowu oznacza to, że za każdym razem, gdy pożyczają pamięć ze sterty i nigdy nie wracają, jest to złe programowanie, więc powinniśmy napisać free (adres pamięci, która powinna zostać zwolniona) przed zwróceniem. Dlatego zawsze, gdy ważne jest używanie malloc free. Używając malloc, zachowaliśmy pamięć, a malloc alokuje pamięć tak dużą, jak o to poprosisz.

Szczęśliwa dynamiczna alokacja pamięci!

Gry How to download and Play Sid Meier's Civilization VI on Linux
How to download and Play Sid Meier's Civilization VI on Linux
Introduction to the game Civilization 6 is a modern take on the classic concept introduced in the series of the Age of Empires games. The idea was fai...
Gry How to Install and Play Doom on Linux
How to Install and Play Doom on Linux
Introduction to Doom The Doom Series originated in the 90s after the release of the original Doom. It was an instant hit and from that time onwards th...
Gry Vulkan for Linux Users
Vulkan for Linux Users
With each new generation of graphics cards, we see game developers push the limits of graphical fidelity and come one step closer to photorealism. But...