Список билетов для зачёта по теории

  1. История языка программирования Си. Цель создания. Место в современной индустрии программирования. Виды поведения программы на языке Си.
  2. Хранение данных. Биты и байты. Адрес. Адресное пространство. Функции и объекты.
  3. Тип данных. Конечность памяти. Размеры типов данных. Эффективное и компактное хранение. Стандартные размеры типов данных.
  4. Кодирование беззнаковых чисел. Переполнение арифметических операций. Кодирование знаковых чисел. Целые типы языка программирования Си.
  5. Объекты. Область видимости. Тип хранения. Время жизни. Глобальные переменные. Инициализация глобальных переменных.
  6. Вывод данных по формату. Эскейп последовательности. Спецификаторы формата. Ввод данных.
  7. Арифметические операторы. Логические операторы. Битовые операторы. Операторы присваивания. lvalue. Операторы сравнения и равенства.
  8. Условный (тернарный) оператор. Оператор приведения. Условный оператор. Операторы циклов. Операторы break и continue.
  9. Функции. Объявления и определения. Локальные переменные. Параметры. Передача параметров по значению. Возвращаемое значение.
  10. Защита от некорректных входных данных программы. Защита от некорректных значений параметров функций. Функция exit. Макрос assert.
  11. Стек вызовов. Фреймы функций. Счётчик команд. Адрес возврата. Указатель на стек. Переполнение стека. Guard page.
  12. Оператор взятия адреса. Указатели. Операция разыменования. Передача параметров по адресу. Пример с функцией swap.
  13. Содержимое указателя. Преобразования между указателями и числами. null pointer. Множество значений указателей. Битность архитектуры.
  14. sizeof. size_t. Адресная арифметика. Одномерные массивы. Реализация операции доступа к элементу. Выход за границы массива.
  15. Индексация массива. Итерация по массиву. Поиск в массивах. Передача массива в функцию. Возврат массива из функции.
  16. Compile-time known и run-time known значения. VLA. Проблема с использованием локальных переменных и проблема с переполнением стека в контексте VLA.
  17. Динамическая память. malloc. Нетипизированные указатели. Обработка нехватки памяти. free. Утечки памяти. calloc.
  18. realloc. Реаллокация in-place. Краевые случаи использования функций распределения динамической памяти. Возврат массива из функции. Эффективная реализация динамического массива.
  19. Плоские многомерные массивы. Реализация доступа к элементу. Variably Modified type. Передача плоского многомерного массива в функцию. Плоские многомерные массивы в динамической памяти.
  20. Зубчатые многомерные массивы. Реализация. Сравнение с плоскими многомерными массивами.
  21. Символы. ASCII. Возврат каретки и перевод строки. Символьные константы. Коды символов. Проблемы чтения символов. EOF. Чтение входного потока до конца.
  22. Нуль-терминированные строки. Длина и ёмкость строки. Инициализация строк. Ввод и вывод. Проблемы чтения. Переполнение буфера.
  23. Строковые литералы. Контроль неизменяемости. const. Комбинации const и указателей.
  24. Стандартная библиотека языка программирования Си. strlen, strchr, strcpy, strcat, strcmp. Принцип выделения памяти при работе утилитарных функций.
  25. Метки. Оператор goto. Обход определений. Оператор switch. fallthrough поведение. Области видимости внутри switch. Способы реализации - lookup switch и table switch.
  26. Обнаружение и обработка ошибок. Прерывание программы. atexit коллбэки. Обработка без прерывания программы. Использование возвращаемого значения и параметров-указателей для передачи данных об ошибке. Коды ошибок. errno.
  27. Проблема промежуточных функций при обработке ошибок. Нелокальный переход. jmp_buf, setjmp, longjmp. Значения объектов при нелокальном переходе.
  28. Композиция. Реализация композиции массивом байтов. Структуры. Доступ к полю. Вложенные структуры. Копирование структур.
  29. Выравнивание объектов. Натуральное выравнивание. Порядок и выравнивание полей в структуре. Размер структур. Плоские массивы структур.
  30. Структуры, как типы данных. Корректные состояния. Инициализация структур. Передача и возврат структур. Деинициализация. Инициализация структур по значению.
  31. typedef. Анонимные структуры. Перечисления. Объединения.
  32. Функции с переменным числом аргументов. Реализация для System V ABI для Intel386.
  33. Битовые поля. Компактная упаковка данных.
  34. Указатели на функции. Функции, как объекты первого класса.
  35. Аргументы командной строки. Рабочий каталог.
  36. Файлы. Режимы работы с файлами. Текстовые и бинарные файлы. Порядок байтов. Стандартные потоки ввода-вывода.
  37. Препроцессор. Фазы трансляции. Экранированные переводы строк. Токены препроцессора. Директивы препроцессора. Конкатенация строковых литералов.
  38. Макросы. Цикл жизни макроса. Object-like макросы. Сравнение с константными переменными.
  39. Условная компиляция. Директивы условной компиляции. Пример с отладочной печатью. Правила вычисления выражений условной компиляции.
  40. Вставка файлов исходного кода или заголовочных файлов. Проблемы повторной вставки. Include guards. #pragma once.
  41. Function-like макросы. Использование вместо функций. Проблемы. Генерация кода макросами.
  42. Формат ELF. Объектные файлы. Последовательность компиляции. Промежуточные файлы. Инструменты чтения и изучения ELF файлов.
  43. Содержимое ELF файлов. Заголовки, секции и сегменты. Дизассемблирование. Синтаксисы языков ассемблера.
  44. Символы ELF формата. Абсолютные и относительные адреса. Фиксапы. Разрешение ссылок.