Якщо ви не знаєте точного обсягу пам'яті, яку потрібно використовувати, вам потрібно динамічне розподіл ( 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
.
malloc()
можуть не вдатися!