Список билетов для зачёта по теории
- История языка программирования Си. Цель создания. Место в современной индустрии
программирования. Виды поведения программы на языке Си.
- Хранение данных. Биты и байты. Адрес. Адресное пространство. Функции и объекты.
- Тип данных. Конечность памяти. Размеры типов данных. Эффективное и компактное хранение.
Стандартные размеры типов данных.
- Кодирование беззнаковых чисел. Переполнение арифметических операций. Кодирование знаковых чисел.
Целые типы языка программирования Си.
- Объекты. Область видимости. Тип хранения. Время жизни. Глобальные переменные. Инициализация
глобальных переменных.
- Вывод данных по формату. Эскейп последовательности. Спецификаторы формата. Ввод данных.
- Арифметические операторы. Логические операторы. Битовые операторы. Операторы присваивания.
lvalue. Операторы сравнения и равенства.
- Условный (тернарный) оператор. Оператор приведения. Условный оператор. Операторы циклов.
Операторы break и continue.
- Функции. Объявления и определения. Локальные переменные. Параметры. Передача параметров по
значению. Возвращаемое значение.
- Защита от некорректных входных данных программы. Защита от некорректных значений параметров
функций. Функция exit. Макрос assert.
- Стек вызовов. Фреймы функций. Счётчик команд. Адрес возврата. Указатель на стек. Переполнение
стека. Guard page.
- Оператор взятия адреса. Указатели. Операция разыменования. Передача параметров по адресу. Пример
с функцией swap.
- Содержимое указателя. Преобразования между указателями и числами. null pointer. Множество
значений указателей. Битность архитектуры.
- sizeof. size_t. Адресная арифметика. Одномерные массивы. Реализация операции доступа к
элементу. Выход за границы массива.
- Индексация массива. Итерация по массиву. Поиск в массивах. Передача массива в функцию. Возврат
массива из функции.
- Compile-time known и run-time known значения. VLA. Проблема с использованием
локальных переменных и проблема с переполнением стека в контексте VLA.
- Динамическая память. malloc. Нетипизированные указатели. Обработка нехватки памяти.
free. Утечки памяти. calloc.
- realloc. Реаллокация in-place. Краевые случаи использования функций распределения
динамической памяти. Возврат массива из функции. Эффективная реализация динамического массива.
- Плоские многомерные массивы. Реализация доступа к элементу. Variably Modified type. Передача
плоского многомерного массива в функцию. Плоские многомерные массивы в динамической памяти.
- Зубчатые многомерные массивы. Реализация. Сравнение с плоскими многомерными массивами.
- Символы. ASCII. Возврат каретки и перевод строки. Символьные константы. Коды символов.
Проблемы чтения символов. EOF. Чтение входного потока до конца.
- Нуль-терминированные строки. Длина и ёмкость строки. Инициализация строк. Ввод и вывод. Проблемы
чтения. Переполнение буфера.
- Строковые литералы. Контроль неизменяемости. const. Комбинации const и указателей.
- Стандартная библиотека языка программирования Си. strlen, strchr, strcpy,
strcat, strcmp. Принцип выделения памяти при работе утилитарных функций.
- Метки. Оператор goto. Обход определений. Оператор switch. fallthrough поведение.
Области видимости внутри switch. Способы реализации - lookup switch и table switch.
- Обнаружение и обработка ошибок. Прерывание программы. atexit коллбэки. Обработка без
прерывания программы. Использование возвращаемого значения и параметров-указателей для передачи
данных об ошибке. Коды ошибок. errno.
- Проблема промежуточных функций при обработке ошибок. Нелокальный переход. jmp_buf,
setjmp, longjmp. Значения объектов при нелокальном переходе.
- Композиция. Реализация композиции массивом байтов. Структуры. Доступ к полю. Вложенные
структуры. Копирование структур.
- Выравнивание объектов. Натуральное выравнивание. Порядок и выравнивание полей в структуре.
Размер структур. Плоские массивы структур.
- Структуры, как типы данных. Корректные состояния. Инициализация структур. Передача и возврат
структур. Деинициализация. Инициализация структур по значению.
- typedef. Анонимные структуры. Перечисления. Объединения.
- Функции с переменным числом аргументов. Реализация для System V ABI для Intel386.
- Битовые поля. Компактная упаковка данных.
- Указатели на функции. Функции, как объекты первого класса.
- Аргументы командной строки. Рабочий каталог.
- Файлы. Режимы работы с файлами. Текстовые и бинарные файлы. Порядок байтов. Стандартные потоки
ввода-вывода.
- Препроцессор. Фазы трансляции. Экранированные переводы строк. Токены препроцессора. Директивы
препроцессора. Конкатенация строковых литералов.
- Макросы. Цикл жизни макроса. Object-like макросы. Сравнение с константными переменными.
- Условная компиляция. Директивы условной компиляции. Пример с отладочной печатью. Правила
вычисления выражений условной компиляции.
- Вставка файлов исходного кода или заголовочных файлов. Проблемы повторной вставки. Include
guards. #pragma once.
- Function-like макросы. Использование вместо функций. Проблемы. Генерация кода макросами.
- Формат ELF. Объектные файлы. Последовательность компиляции. Промежуточные файлы. Инструменты
чтения и изучения ELF файлов.
- Содержимое ELF файлов. Заголовки, секции и сегменты. Дизассемблирование. Синтаксисы языков
ассемблера.
- Символы ELF формата. Абсолютные и относительные адреса. Фиксапы. Разрешение ссылок.