Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Malloc та Free | Вказівники
Основи C

bookMalloc та 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

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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 перед його використанням, щоб переконатися, що ви не звертаєтеся до недійсної або вже виділеної пам'яті.

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 6. Розділ 4

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Suggested prompts:

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

bookMalloc та 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

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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 перед його використанням, щоб переконатися, що ви не звертаєтеся до недійсної або вже виділеної пам'яті.

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 6. Розділ 4
some-alt