JAK KORZYSTAĆ Z FUNKCJI MALLOC W C?

How Use Malloc Function 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 — statyczna i dynamiczna. 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 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 tym, jak użytkownik jest odpowiedzialny za rzutowanie typu na odpowiedni typ, aby mógł być prawidłowo używany 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 zostanie zapisany 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. Powyżej i oraz n zadeklarowaliśmy dwie zmienne. Zmienna n to miejsce, w którym będziemy przechowywać numer wprowadzony przez użytkownika. 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 typu całkowitego, a adres przechowujemy we wskaźniku ptr. Rzutowanie typów jest ważne, 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 jedna po drugiej. 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 przyjmę, że rozmiar liczby całkowitej to 4 bajty i będzie ona równa 1004, więc następna liczba całkowita będzie przechowywana w lokalizacji 1004. I to będzie kontynuowane w ten sposób, że 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 rozmiar liczby całkowitej wynosi 4. Znowu. Wyłuskujemy to, więc da nam to 2NSliczba 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 zostanie to wyświetlone.

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 do sterty, 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 powrotem. Dlatego zawsze ważne jest, aby używać malloc free. Używając malloc, zachowaliśmy pamięć, a malloc alokuje pamięć tak dużą, jak o to poprosisz.

Miłego dynamicznego przydzielania pamięci!