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

Зміст курсу

Основи C

Основи C

1. Вступ
2. Дані
3. Оператори
4. Оператори управління
5. Функції
6. Вказівники

book
Malloc і Free

Ці функції дозволяють нам створювати нові об'єкти не під час компіляції, а під час виконання програми, що дозволяє використовувати динамічне виділення пам'яті.

malloc()

Раніше, щоб виділити пам'ять для наших даних, ми просто оголошували:

Тепер, з функцією malloc(), ми можемо виділяти пам'ять динамічно:

Функція malloc() вимагає кількість байтів, які потрібно виділити як свій аргумент. Якщо ви не впевнені у потрібному розмірі байтів, але знаєте тип даних, які потрібно зберегти, ви можете налаштувати вираз так:

Що далі? Зверніть увагу, що ми присвоюємо результат функції malloc() вказівнику. Це означає, що malloc() повертає адресу!

Префікс (int*) є явним приведенням типу. Ми вручну вказуємо бажаний тип. Наприклад:

c

Main

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(), ми використовуємо оператор розіменування.

c

Main

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()

Ця функція використовується з вказівниками. Щоб проілюструвати, давайте розширимо приклад вище:

c

Main

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.

c

Main

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
We're sorry to hear that something went wrong. What happened?
some-alt