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

book
Malloc і Free

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

malloc()

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

python
int x;

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

python
int* pX = (int*)malloc(4);

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

python
int* pX = (int*)malloc(sizeof(int));

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

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

python
double x = 3.14;
int y = (int)x; // `y` = 3

Main.c

Main.c

copy
#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;
}
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
#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;
}
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
#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;
}
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
#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;
}
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

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

We use cookies to make your experience better!
some-alt