Зміст курсу
Основи C
Основи C
Malloc і Free
Ці функції дозволяють нам створювати нові об'єкти не під час компіляції, а під час виконання програми, що дозволяє використовувати динамічне виділення пам'яті.
malloc()
Раніше, щоб виділити пам'ять для наших даних, ми просто оголошували:
Тепер, з функцією malloc()
, ми можемо виділяти пам'ять динамічно:
Функція malloc()
вимагає кількість байтів, які потрібно виділити як свій аргумент. Якщо ви не впевнені у потрібному розмірі байтів, але знаєте тип даних, які потрібно зберегти, ви можете налаштувати вираз так:
Що далі?
Зверніть увагу, що ми присвоюємо результат функції malloc()
вказівнику. Це означає, що malloc()
повертає адресу!
Префікс (int*)
є явним приведенням типу. Ми вручну вказуємо бажаний тип. Наприклад:
Main
#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
#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
#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
#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
, перш ніж використовувати його, щоб переконатися, що ви не звертаєтеся до недійсної або вже виділеної пам'яті.
Дякуємо за ваш відгук!