C C  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Указатели на функции

Тест проверяет косвенный вызов как полноценный интерфейс: точную сигнатуру, таблицы диспетчеризации, срок жизни регистрации, пользовательский контекст и диагностику аварий, когда адрес функции или контекст уже недействителен.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 5 темам.
Вопрос 1 из 25
Как объявить указатель op на функцию `int f(int,int)`?
CC17
int add(int left, int right);
/* Объявите переменную op, способную хранить адрес add. */
Вопрос 2 из 25
Зачем в этом объявлении вводят имя типа функции `binary_op` через `typedef`?
CC17
typedef int binary_op(int,int);
binary_op *op;
Вопрос 3 из 25
Можно ли вызывать функцию через указатель несовместимого типа после каста?
CC17
double f(double);
int (*p)(int)=(int(*)(int))f;
int x=p(1);
Вопрос 4 из 25
Эквивалентны ли `op(a,b)` и `(*op)(a,b)`?
CC17
int r1=op(1,2);
int r2=(*op)(1,2);
Вопрос 5 из 25
Какой параметр лучше для компаратора qsort?
Вопрос 6 из 25
Что нужно проверить перед `handlers[cmd]()`?
CC17
if(cmd<COUNT && handlers[cmd]) handlers[cmd]();
Вопрос 7 из 25
Как объявить массив из трёх указателей на функции void(void)?
CC17
void (*handlers[3])(void);
Вопрос 8 из 25
Когда таблица диспетчеризации предпочтительнее switch?
Вопрос 9 из 25
Почему внешний код операции нельзя без проверки использовать как индекс?
CC17
handlers[packet.opcode](packet.payload);
Вопрос 10 из 25
Как хранить вместе имя команды и обработчик?
CC17
struct command { const char *name; handler_fn fn; };
Вопрос 11 из 25
Что нужно проверить, если указатель на функцию и пользовательский контекст сохраняются для будущего вызова?
Вопрос 12 из 25
Как передать ошибку из функции обратного вызова вызывающему коду?
CC17
typedef enum { CB_OK,CB_STOP,CB_ERROR } cb_result;
Вопрос 13 из 25
Почему удаление текущей функции обратного вызова из списка во время итерации опасно?
CC17
for(node=list;node;node=node->next) node->fn(node->ctx);
Вопрос 14 из 25
Как безопасно вызвать необязательную функцию обратного вызова?
CC17
typedef void (*event_fn)(void *ctx, const struct event *event);

struct listener {
    event_fn on_event; /* поле может быть NULL */
    void *ctx;
};
Вопрос 15 из 25
Что означает синхронный обратный вызов?
Вопрос 16 из 25
Зачем функции обратного вызова часто передают `void *user_data`?
CC17
void on_data(void *user,const void *buf,size_t n){ struct parser *p=user; ... }
Вопрос 17 из 25
Что нужно доказать перед приведением `user_data` к `struct parser *`?
Вопрос 18 из 25
Можно ли передать адрес локальной переменной асинхронному обработчику?
CC17
void start(void){ struct ctx c; register_async(cb,&c); }
Вопрос 19 из 25
Как обслуживать несколько экземпляров устройства одной функцией обратного вызова?
Вопрос 20 из 25
Кто отвечает за время жизни пользовательского контекста?
Вопрос 21 из 25
Как в GDB найти имя функции по адресу обработчика?
CGDB
(gdb) p/x handler
(gdb) info symbol 0x...
Вопрос 22 из 25
Что первым проверить при сбое на косвенном вызове?
Вопрос 23 из 25
Какое предупреждение компилятора полезно для поиска опасных приведений указателей на функции?
CC17
typedef int (*handler_fn)(const char *);

handler_fn load_handler(void *symbol) {
    return (handler_fn)symbol;
}
Вопрос 24 из 25
Что даёт трассировка стека после сбоя функции обратного вызова?
CGDB
(gdb) bt full
Вопрос 25 из 25
Как ловить устаревший контекст системно?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу