Управление памятью в C

от автора

ПРИВЕТ, ХАРБ!

В статье, я расскажу базу про то, как управлять памятью в языке программирования в 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *