Malloc та Free
Ці функції дозволяють створювати нові об'єкти не під час компіляції, а під час виконання програми, що забезпечує використання динамічного виділення пам'яті.
malloc()
Раніше для виділення пам'яті під наші дані ми просто оголошували:
int x;
Тепер, за допомогою функції malloc(), ми можемо виділяти пам'ять динамічно:
int* pX = (int*)malloc(4);
Функція malloc() вимагає вказати кількість байтів для виділення як аргумент. Якщо ви не впевнені у потрібному розмірі в байтах, але знаєте тип даних, який буде зберігатися, ви можете скоригувати вираз так:
int* pX = (int*)malloc(sizeof(int));
Що далі?
Зверніть увагу, що результат функції malloc() ми присвоюємо вказівнику. Це означає, що malloc() повертає адресу!
Префікс (int*) — це явне приведення типу. Ми вручну вказуємо бажаний тип. Наприклад:
double x = 3.14;
int y = (int)x; // `y` = 3
Main.c
1234567891011#include <stdio.h> #include <stdlib.h> // new header file! int main() { int* pX = (int*)malloc(sizeof(int)); printf("Address of allocated memory: %p\n", pX); return 0; }
Примітка
Не забудьте підключити заголовочний файл
stdlib.h. Він містить прототип функціїmalloc().
Для збереження даних за адресою, яку повертає функція malloc(), використовується оператор розіменування.
Main.c
123456789101112#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); return 0; }
Чи можливо звільнити пам'ять? – Так, але лише ту пам'ять, яка була виділена за допомогою malloc() та подібних функцій.
free()
Ця функція використовується з вказівниками. Для ілюстрації розглянемо розширений приклад з попереднього розділу:
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); free(pX); printf("After `free()` value %d at address %p\n", *pX, pX); return 0; }
Цікаво, що навіть після "видалення" вказівника він залишається працездатним, але значення, що зберігається у відповідній комірці пам'яті, стає некоректним.
Це призводить до проблеми: зайнята комірка пам'яті тепер містить ненадійні дані. Щоб уникнути таких ситуацій, використаний вказівник слід скинути до NULL.
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf("Value %d at address %p\n", *pX, pX); free(pX); pX = NULL; return 0; }
Встановлення покажчика у значення NULL після звільнення його пам'яті є чітким способом вказати, що покажчик більше не посилається на дійсну область пам'яті.
Завжди перевіряйте, чи дорівнює покажчик NULL перед його використанням, щоб переконатися, що ви не звертаєтеся до недійсної або вже виділеної пам'яті.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Can you explain more about how malloc() and free() work together?
What happens if I forget to free memory allocated with malloc()?
Why is it important to set a pointer to NULL after freeing it?
Awesome!
Completion rate improved to 2.63
Malloc та Free
Свайпніть щоб показати меню
Ці функції дозволяють створювати нові об'єкти не під час компіляції, а під час виконання програми, що забезпечує використання динамічного виділення пам'яті.
malloc()
Раніше для виділення пам'яті під наші дані ми просто оголошували:
int x;
Тепер, за допомогою функції malloc(), ми можемо виділяти пам'ять динамічно:
int* pX = (int*)malloc(4);
Функція malloc() вимагає вказати кількість байтів для виділення як аргумент. Якщо ви не впевнені у потрібному розмірі в байтах, але знаєте тип даних, який буде зберігатися, ви можете скоригувати вираз так:
int* pX = (int*)malloc(sizeof(int));
Що далі?
Зверніть увагу, що результат функції malloc() ми присвоюємо вказівнику. Це означає, що malloc() повертає адресу!
Префікс (int*) — це явне приведення типу. Ми вручну вказуємо бажаний тип. Наприклад:
double x = 3.14;
int y = (int)x; // `y` = 3
Main.c
1234567891011#include <stdio.h> #include <stdlib.h> // new header file! int main() { int* pX = (int*)malloc(sizeof(int)); printf("Address of allocated memory: %p\n", pX); return 0; }
Примітка
Не забудьте підключити заголовочний файл
stdlib.h. Він містить прототип функціїmalloc().
Для збереження даних за адресою, яку повертає функція malloc(), використовується оператор розіменування.
Main.c
123456789101112#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); return 0; }
Чи можливо звільнити пам'ять? – Так, але лише ту пам'ять, яка була виділена за допомогою malloc() та подібних функцій.
free()
Ця функція використовується з вказівниками. Для ілюстрації розглянемо розширений приклад з попереднього розділу:
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); free(pX); printf("After `free()` value %d at address %p\n", *pX, pX); return 0; }
Цікаво, що навіть після "видалення" вказівника він залишається працездатним, але значення, що зберігається у відповідній комірці пам'яті, стає некоректним.
Це призводить до проблеми: зайнята комірка пам'яті тепер містить ненадійні дані. Щоб уникнути таких ситуацій, використаний вказівник слід скинути до NULL.
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf("Value %d at address %p\n", *pX, pX); free(pX); pX = NULL; return 0; }
Встановлення покажчика у значення NULL після звільнення його пам'яті є чітким способом вказати, що покажчик більше не посилається на дійсну область пам'яті.
Завжди перевіряйте, чи дорівнює покажчик NULL перед його використанням, щоб переконатися, що ви не звертаєтеся до недійсної або вже виділеної пам'яті.
Дякуємо за ваш відгук!