Alokacja dynamiczna — malloc()
Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 32 z 63.
Teraz poznasz malloc(), podstawową funkcję służącą do żądania pamięci ze sterty podczas działania programu. Funkcja malloc() oznacza „alokację pamięci” i pozwala dynamicznie przydzielać pamięć wtedy, gdy jej potrzebujesz, zamiast deklarować zmienne o stałym rozmiarze podczas kompilacji.
Funkcja malloc() przyjmuje jeden argument: liczbę bajtów, które chcesz zaalokować. Zwraca wskaźnik void do zaalokowanego bloku pamięci lub NULL, jeśli alokacja się nie powiedzie. Ponieważ zwraca wskaźnik void, możesz przypisać go bezpośrednio do wskaźnika o określonym typie; rzutowanie jest w C opcjonalne (w przeciwieństwie do C++, gdzie jest wymagane).
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Przydziel pamięć na jedną liczbę całkowitą
// ptr wskazuje teraz na obszar pamięci, który może przechowywać liczbę całkowitąGłówną zaletą
malloc()jest elastyczność — możesz zażądać dokładnie takiej ilości pamięci, jakiej potrzebujesz w czasie działania programu, a pamięć ta pozostaje dostępna, dopóki jej jawnie nie zwolnisz. Jest to szczególnie przydatne, gdy nie wiesz, ile pamięci będzie potrzebować Twój program, dopóki nie zacznie działać.
Pamiętaj, aby dołączyć <stdlib.h>, żeby używać malloc(). Rzutowanie zwróconego wskaźnika void jest w C opcjonalne, ponieważ jest on automatycznie konwertowany na typ, do którego go przypisujesz.
Wyzwanie
ŁatwyNapisz program w C, który demonstruje dynamiczną alokację pamięci za pomocą malloc() do utworzenia i obsługi pojedynczej liczby całkowitej na stercie. Twój program powinien:
- Użyć
malloc()do dynamicznego zaalokowania pamięci na jedną liczbę całkowitą - Rzutować zwrócony wskaźnik void na wskaźnik do liczby całkowitej
- Odczytać liczbę całkowitą z danych wejściowych użytkownika
- Zapisać wartość wejściową w dynamicznie zaalokowanej pamięci za pomocą operatora dereferencji
- Wypisać zapisaną wartość w formacie:
Stored value: [value] - Obliczyć kwadrat wartości i zapisać go w tym samym miejscu pamięci
- Wypisać wartość podniesioną do kwadratu w formacie:
Squared value: [value]
Pamiętaj, aby dołączyć nagłówek <stdlib.h>, aby móc używać malloc(). Twój program powinien demonstrować podstawowy przebieg dynamicznej alokacji pamięci: pobieranie pamięci ze sterty, używanie jej do przechowywania i przetwarzania danych oraz korzystanie z zaalokowanej pamięci za pomocą operacji na wskaźnikach.
Na przykład, jeśli użytkownik wpisze 7, wynikiem powinno być:
Stored value: 7
Squared value: 49To wyzwanie wprowadza Cię w podstawowe pojęcie dynamicznej alokacji pamięci, w której pamięć jest przydzielana w czasie wykonywania programu, a nie ustalana podczas kompilacji, co zapewnia programom większą elastyczność w korzystaniu z pamięci.
Spróbuj swoich sił
#include <stdio.h>
#include <stdlib.h>
int main() {
// Wczytaj dane wejściowe
int input_value;
scanf("%d", &input_value);
// TODO: Napisz swój kod poniżej
// 1. Użyj malloc(), aby przydzielić pamięć na jedną liczbę całkowitą
// 2. Rzutuj zwrócony wskaźnik na int*
// 3. Zapisz wartość wejściową w przydzielonej pamięci
// 4. Wypisz zapisaną wartość
// 5. Oblicz kwadrat i zapisz go w tym samym miejscu
// 6. Wypisz wartość podniesioną do kwadratu
return 0;
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i sterowanie przepływem
1Podstawy wskaźników
Czym jest wskaźnik?Deklarowanie wskaźnikówOperator pobrania adresu (&)Operator dereferencji (*)Wskaźniki NULLPodsumowanie: podstawy wskaźników4Projekt: Proste narzędzie tekstowe
Przegląd projektuLiczenie znaków2Wskaźniki i tablice
Nazwy tablic jako wskaźnikiElementy tablic — wskaźnikiArytmetyka wskaźnikówPorównywanie wskaźnikówPodsumowanie: przechodzenie po tablicy za pomocą wskaźników5Wskaźniki i funkcje
Przekazywanie przez wartośćPrzekazywanie wskaźników do funkcjiModyfikowanie zmiennych za pomocą wskaźnikówKlasyczny przykład: zamianaPrzekazywanie tablic do funkcjiPowtórka: argumenty wskaźnikowe funkcji8Struktury i wskaźniki
Wskaźniki do strukturOperator strzałki (->)Przekazywanie struktur przez wartośćPrzekazywanie wskaźników do strukturDynamiczna alokacja strukturPodsumowanie: modyfikowanie struktury — wskaźnik11Końcowe zadania powtórkowe
Powtórka: dynamiczne łączenie ciągów znakówPowtórka: tablica strukturPowtórka: licznik częstotliwości słów3Tablice znaków i ciągi znaków
Ciągi znaków jako tablice charZnak końca ciąguWczytywanie ciągu za pomocą scanfUżywanie strlen()Używanie strcpy()Używanie strcat()Używanie strcmp()Podsumowanie: podstawowe funkcje do obsługi ciągów znaków6Zarządzanie pamięcią
Pamięć stosu a stertyAlokacja dynamiczna — malloc()Użycie sizeof() do alokacjiSprawdzanie niepowodzenia alokacjiZwalnianie pamięci za pomocą free()Alokacja za pomocą calloc()Podsumowanie: tablica dynamicznaPoćwicz samodzielnie: Kompilator C online