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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

В статье, я расскажу как управлять памятью в языке программирования в C. Для понимания материала, вам уже нужно знать как работать с указателями.

Начнем

Сначало разберем 2 самые простые функции, это malloc и free. Эти функции нкходятся в заголовочном файле "stdlib.h", так что подключаем его для работы.

Что делают это функции? malloc выделяет память, а free освобождает, сейчас разберем поподробнее.

Malloc

Как вы уже поняли выделяет память, если более оффициально то возвращает адрес первого байта в памяти, или указатель. В него мы просто должны передать столько байт, сколько нам надо. С помощью этой функции нельзя выделять биты, она работает исключительно с байтами.

Например если нужно выделить память под переменную типа данных int, то в параметры нужно передать sizeof(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);
}

В консоль выведется что-то вроде:

0x7ffe49f8 - 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.

НО, это намного круче чем класс Object, но почему? В этот указатель можно помещать не только обычные значения, а даже функции!

#include<stdlin.h>

void main() {
  void* a = (int*)malloc(4);
  *a = 7;
  free(a);
}

Это простой пример который никто не использует)

Пока, Хабр...

Источник: https://habr.com/ru/articles/857316/


Интересные статьи

Интересные статьи

Смартфоны с гибким дисплеем уже давно стали привычными. Помню, как после выхода в продажу первого такого девайса новости об этом появились везде, даже на самых непрофильных ресурсах. Сейчас же моделей...
На Хабре ни для кого не секрет, что в текущей повестке практически все сферы частного бизнеса вынуждены реагировать на происходящие изменения. Большое количество привычных всем нам зарубежных сервисов...
Привет, Хабр! Сегодня в дайджесте мы хотим рассказать о взломах, которые  совершили хакеры с применением нашумевшей уязвимости  Log4j с ее помощью. Также мы поговорим о росте количества уязв...
Периодически мне в разных вариантах задают вопрос, который «в среднем» звучит так: «что лучше: заказать интернет-магазин на бесплатной CMS или купить готовое решение на 1С-Битрикс и сделать магазин на...
Эта публикация написана после неоднократных обращений как клиентов, так и (к горести моей) партнеров. Темы обращений были разные, но причиной в итоге оказывался один и тот же сценарий, реализу...