---
title: Память
seo:
  title: Память — C++ Developer
  description: Тема «Память» для собеседования C++ Developer. Где может храниться переменная? Какая разница между calloc и malloc?
---

[Все темы C++ Developer](/c-developer)

## <strong>Где может храниться переменная?</strong> [#q-14bee738d69b818cb0e6f8336eddfa57]

В языке программирования C переменные могут храниться в различных областях памяти, каждая из которых имеет свои особенности по времени жизни и области видимости. Вот основные места хранения переменных&#58;

{/* prettier-ignore */}
1. <strong>Стек</strong> <code>&#40;Stack&#41;</code>&#58; Локальные переменные внутри функций обычно хранятся на стеке. Они создаются при вызове функции и уничтожаются при её завершении.

1. <strong>Куча</strong> <code>&#40;Heap&#41;</code>&#58; Динамически выделенная память (через <code>malloc</code>, <code>calloc</code>, <code>realloc</code> и другие функции) находится в куче. Переменные в куче сохраняются до тех пор, пока не будут освобождены с помощью <code>free</code>.

1. <strong>Глобальная память</strong> <code>&#40;Global Area&#41;</code>&#58; Глобальные и статические переменные хранятся в глобальной области памяти. Они инициализируются при запуске программы и существуют до её завершения.

1. <strong>Регистры</strong> <code>&#40;Registers&#41;</code>&#58; Компилятор может оптимизировать программу, помещая некоторые переменные непосредственно в регистры процессора для быстрого доступа.

1. <strong>Литеральный пул</strong> <code>&#40;Literal Pool&#41;</code>&#58; Константы, такие как строковые литералы, обычно хранятся в отдельной области памяти, оптимизированной для неизменяемых данных.

:::note[Ссылки для изучения]

1. [Выделение и освобождение памяти в C](https://metanit.com/c/tutorial/5.8.php)
   :::

---

## <strong>Какая разница между</strong> <code>calloc</code> <strong>и</strong> <code>malloc</code><strong>?</strong> [#q-14bee738d69b819fbcb8c0d7954f9f9d]

Функции <code>calloc</code> и <code>malloc</code> используются в языке программирования C для динамического выделения памяти, но они работают немного по-разному&#58;

{/* prettier-ignore */}
1. <strong>malloc (Memory Allocation)</strong>&#58;

    - <strong>Принцип работы</strong>&#58; Выделяет блок памяти заданного размера.

    - <strong>Инициализация</strong>&#58; Память, выделенная с помощью <code>malloc</code>, не инициализируется. Это означает, что начальные значения в выделенной памяти не определены (могут быть мусорные значения).

    - <strong>Синтаксис</strong>&#58; <code>void&#42; malloc&#40;size&#95;t size&#41;&#59;</code>

    - <strong>Пример</strong>&#58; <code>int&#42; ptr &#61; malloc&#40;10 &#42; sizeof&#40;int&#41;&#41;&#59;</code> выделит память для 10 целочисленных значений, но не инициализирует их.

1. <strong>calloc (Contiguous Allocation)</strong>&#58;

    - <strong>Принцип работы</strong>&#58; Выделяет блок памяти для массива элементов заданного размера и количества.

    - <strong>Инициализация</strong>&#58; Память, выделенная с помощью <code>calloc</code>, автоматически инициализируется нулями.

    - <strong>Синтаксис</strong>&#58; <code>void&#42; calloc&#40;size&#95;t num&#44; size&#95;t size&#41;&#59;</code>

    - <strong>Пример</strong>&#58; <code>int&#42; ptr &#61; calloc&#40;10&#44; sizeof&#40;int&#41;&#41;&#59;</code> выделит память для 10 целочисленных значений и инициализирует их нулями.

Основное отличие между <code>malloc</code> и <code>calloc</code> заключается в инициализации&#58; <code>calloc</code> инициализирует выделенную память нулями, в то время как <code>malloc</code> оставляет память неинициализированной.

:::note[Ссылки для изучения]

1. [Выделение и освобождение памяти в C](https://metanit.com/c/tutorial/5.8.php)
   :::
