Если вы не знаете точный объем памяти, который вам нужно использовать, вам нужно динамическое выделение (malloc
). Примером может служить случай, когда пользователь открывает файл в вашем приложении. Вам нужно будет прочитать содержимое файла в память, но, конечно, вы не знаете заранее размер файла, так как пользователь выбирает файл на месте, во время выполнения. Так что в основном вам нужно malloc
, когда вы не знаете размер данных, с которыми вы работаете заранее. По крайней мере, это одна из основных причин использования malloc
. В вашем примере с простой строкой, размер которой вы уже знаете во время компиляции (плюс вы не хотите ее изменять), нет смысла динамически выделять ее.
Немного не по теме, но ... вы должны быть очень осторожны, чтобы не создавать утечки памяти при использовании malloc
. Рассмотрим этот код:
int do_something() {
uint8_t* someMemory = (uint8_t*)malloc(1024);
// Do some stuff
if ( /* some error occured */ ) return -1;
// Do some other stuff
free(someMemory);
return result;
}
Вы видите, что не так с этим кодом? Между malloc
и free
существует условный оператор возврата. Сначала это может показаться нормальным, но подумайте об этом. Если есть ошибка, вы вернетесь без освобождения выделенной памяти. Это распространенный источник утечек памяти.
Конечно, это очень простой пример, и здесь очень легко увидеть ошибку, но представьте, что сотни строк кода завалены указателями, malloc
s, free
s и всеми видами обработки ошибок. Вещи могут стать действительно грязными очень быстро. Это одна из причин, по которой я предпочитаю современный C ++ вместо C в применимых случаях, но это уже совсем другая тема.
Поэтому, всякий раз, когда вы используете malloc
, всегда следите, чтобы ваша память с вероятностью составляла free
d.