ПРИВЕТ, ХАРБ!
В статье, я расскажу базу про то, как управлять памятью в языке программирования в C. Для понимания материала, вам уже нужно знать как работать с указателями.
Начнем
Сначало разберем 2 самые простые функции, это malloc и free. Эти функции нкходятся в заголовочном файле «stdlib.h», так что подключаем его для работы.
Что делают это функции? malloc выделяет память, а free освобождает, сейчас разберем поподробнее.
Malloc
Как вы уже поняли выделяет память, если более оффициально то возвращает адрес первого байта в памяти, или указатель. В него мы просто должны передать столько байт, сколько нам надо. С помощью этой функции нельзя выделять биты, она работает исключительно с байтами.
Например если нужно выделить память под переменную типа данных int, то в параметры нужно передать sizeof(int), эта операция возвратиь размер в байтах переданного обьекта. Также можно сразу указать 4 байта, так как в основном int требует именнт столько (зависит от архитектуры процессора).
Free
Эта же функция освобождает выделеную память и после освобождения мы уже не сможем воспользоваться тем что освободили. В параметры передаем указатель на выделеную память.
Ее необходимо нужно вызывать тогда, когда указатель вам уже не нужен, иначе будет случаться утечка памяти.
Пример
Ну и конечно же приведу пример использования выше написаного материала. Создадим структуру Point с полями x и y, и выделим, а потом и освободим память выделеную под этот обьект.
#include<stdio.h> #include<stdlib.h> 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); }
В консоль выведется что-то вроде:
0x7ffe42fo - x: 162, y: 13
Остальные функции
realloc — изменяет размер выделеной памяти, имеет следующие параметры: realloc(void* ptr, size_t new_size). ptr — это указатель на уже выделеную память, а new_size это новый размер выделеной памяти.
memcpy — копирует данные другого указателя, имеет следующие параметры: 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
#include<stdlib.h> void main() { void* a = (int*)malloc(4); *a = 7; free(a); }
Это простой пример который никто не использует)
Пока, Хабр.
ссылка на оригинал статьи https://habr.com/ru/articles/857316/
Добавить комментарий