awesome-everything EN
↑ Обратно к восхождению

Базовый CS с нуля

Память: чтение диаграмм и трассировок

Суть Читай диаграммы памяти и небольшие сниппеты, считай адресную арифметику, трассируй dereference и решай stack vs heap.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 14 min

Вопросы про память — на деле вопросы про диаграммы. Прочитай каждую раскладку или сниппет, трассируй, что машина делает ячейка за ячейкой, и выбери ответ, совпадающий с моделью — address vs value, byte-смещения, dereference и где живут данные.

Цель

Отработай движения, которые будешь повторять всегда: прочитать диаграмму памяти, посчитать byte-address по смещению, пройти по pointer на один шаг и рассудить, лежит value на stack или на heap.

Сниппет 1 — диаграмма памяти

addr:   0    1    2    3    4    5
value: 25   30    3    0   99   12
Викторина

Ячейка по address 2 хранит value 3, и программа трактует address 2 как pointer. Сделай dereference: какое value вернётся?

Сниппет 2 — адресная арифметика

Массив 32-битных целых начинается с address 200.
Каждый элемент шириной 4 byte (32 бита).
Элементы лежат вплотную без зазоров.
Викторина

По какому byte-address начинается элемент с индексом 3 (четвёртый элемент)?

Сниппет 3 — размещение stack vs heap

int* make_counter() {
    int local = 0;        // строка A
    int* shared = malloc(sizeof(int));  // строка B
    *shared = 0;
    return shared;        // возвращает heap-pointer
}
Викторина

После возврата make_counter что из local (строка A) и int от malloc (строка B) безопасно существует и почему?

Сниппет 4 — трассировка записей

Старт:  addr 10 -> 7,  addr 11 -> 0
Op 1: записать value 4 по address 11
Op 2: записать value 9 по address 10
Op 3: записать value 0 по address 10
Викторина

После всех трёх записей какие value лежат по address 10 и 11?

Итог

Каждая задача здесь решается буквальным чтением диаграммы: value может быть address, поэтому dereference — это второе чтение по тому address; byte-address элемента массива — это base + index * elementSize; выживание value после возврата функции зависит от того, лежал он в stack-фрейме (исчез) или на heap (сохранился); а запись перезаписывает ровно одну ячейку, побеждает последняя запись, и ни один другой address не трогается. Трассируй ячейка за ячейкой — и ответ предопределён.

Продолжить восхождение ↑Память: построй крошечный симулятор памяти
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.