Управление памятью в C
ПРИВЕТ, ХАРБ!
В статье, я расскажу как управлять памятью в языке программирования в C. Для понимания материала, вам уже нужно знать как работать с указателями.
Начнем
Сначало разберем 2 самые простые функции, это malloc и free. Эти функции нкходятся в заголовочном файле «stdlib.h», так что подключаем его для работы.
Что делают это функции? malloc выделяет память, а free освобождает, сейчас разберем поподробнее.
Malloc
Как вы уже поняли выделяет память, если более оффициально то возвращает адрес первого байта в памяти, или указатель. В него мы просто должны передать столько байт, сколько нам надо. С помощью этой функции нельзя выделять биты, она работает исключительно с байтами.
Например если нужно выделить память под переменную типа данных int, то в параметры нужно передать sizeof (int), эта функция возвращает размер в байтах переданного обьекта (хз как это подругому назвать, так что пусть будет так).
Free
Эта же функция освобождает выделеную память и после освобождения мы уже не сможем воспользоваться тем что освободили. В параметры передаем указатель на выделеную память.
Об этой функции сказать больше нечего…
Пример
Ну и конечно же приведу пример использования выше написаного материала. Создадим структуру Point с полями x и y, и выделим, а потом и освободим память выделеную под этот обьект.
#include
#include
typedef struct {
int* x;
int* y;
} Point;
int main() {
Point* p =
(Point*)
malloc(sizeof(Point));
p->x = 162;
p->y = 13;
printf("%x - x: %d, y: %d",
p, p->x, p->y);
free(p);
}
В консоль выведется что-то вроде:
0x7ffe49f8 - x: 162, y: 13
Остальные функции
realloc — изменяет размер выделеной памяти, имеет следующие параметры: realloc (void* ptr, size_t new_size). ptr — это указатель на уже выделеную память, а new_size это новый размер выделеной памяти.
memcry — копирует данные другого указателя, имеет следующие параметры: memcpy (void dest, const void* src, size_t n). dest — указатель на область куда нужно скопировать данные, src — указатель на источник данных, n — сколько байт нужно скопировать.
calloc — выделяет блок памяти для n элементов каждый размером с sizе байт, заполняя все нулями. Имеет параметры: calloc (size_t n, size_t size). Немного бесполезно, так как это же можно провернуть с malloc переиножив n и size.
Это еще не все функции, но для начала вам с головой хватит которые я предоствил.
Дополнительное
Это не совсем про выделение памяти, а скорее про указатели, но может быть полезно.
Вомзожно вы видели в параметрах void*, это неопределенный тип данных указателя, тоесть туда можно поместить указатель любого другого типа данных. Если вы до этого изучали Java, то это некоторое подобие класса Object.
НО, это намного круче чем класс Object, но почему? В этот указатель можно помещать не только обычные значения, а даже функции! Так можно сделать некую породию на ООП)
Сейчас покажу пример такого использования void*
#include
typedef struct {
int* x;
int* y;
void (*zero)(Vec* v);
} Point;
void zero(Point* vec) {
vec->x = 0;
vec->y = 0;
}
void main() {
Point* p = (Point*)
malloc(sizeof(Point));
p->zero = zero;
p->x = 12;
p->y = 8;
p.zero(p);
}
Это простой пример который никто не использует)
Пока, Хабр!