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
c

Main

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

c

Main

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

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

c

Main

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.

c

Main

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
some-alt