Jeśli nie znasz dokładnego rozmiaru pamięci, której potrzebujesz, potrzebujesz alokacji dynamicznej ( malloc
). Przykładem może być sytuacja, gdy użytkownik otwiera plik w Twojej aplikacji. Będziesz musiał wczytać zawartość pliku do pamięci, ale oczywiście nie znasz z góry rozmiaru pliku, ponieważ użytkownik wybiera plik na miejscu, w czasie wykonywania. Zasadniczo potrzebujesz tego, malloc
gdy nie znasz z góry rozmiaru danych, z którymi pracujesz. Przynajmniej jest to jeden z głównych powodów używania malloc
. W twoim przykładzie z prostym ciągiem znaków, którego rozmiar już znasz w czasie kompilacji (a ponadto nie chcesz go modyfikować), nie ma sensu dynamiczne przydzielanie tego.
Trochę nie na temat, ale ... musisz bardzo uważać, aby nie spowodować wycieków pamięci podczas używania malloc
. Rozważ ten kod:
int do_something() {
uint8_t* someMemory = (uint8_t*)malloc(1024);
if ( ) return -1;
free(someMemory);
return result;
}
Czy widzisz, co jest nie tak z tym kodem? Istnieje warunkowa instrukcja powrotu między malloc
a free
. Na początku może się to wydawać w porządku, ale pomyśl o tym. Jeśli wystąpi błąd, wrócisz bez zwalniania przydzielonej pamięci. Jest to częste źródło wycieków pamięci.
Oczywiście jest to bardzo prosty przykład i bardzo łatwo jest tu dostrzec błąd, ale wyobraź sobie setki wierszy kodu zaśmieconych wskaźnikami, malloc
s, free
s i wszelkiego rodzaju obsługą błędów. Rzeczy mogą się bardzo szybko pogmatwać. Jest to jeden z powodów, dla których zdecydowanie wolę nowoczesny C ++ od C w odpowiednich przypadkach, ale to zupełnie inny temat.
Więc kiedy używasz malloc
, zawsze upewnij się, że twoja pamięć jest free
jak największa.
malloc()
może zawieść!