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

Представление данных в памяти

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

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 5 темам.
Вопрос 1 из 25
Что показывает порядок байтов?
Вопрос 2 из 25
Как переносимо прочитать 32-битное с прямым порядком байтов поле из байтов?
CДекодирование порядка байтов
const unsigned char p[4] = { 0x78, 0x56, 0x34, 0x12 };
/* прочитать little-endian uint32_t */
Вопрос 3 из 25
Почему копирования четырёх сетевых байтов прямо в `uint32_t` недостаточно?
CC17
uint32_t x; memcpy(&x,buf,4);
Вопрос 4 из 25
Что делает `ntohl(net)` с 32-битным значением сетевого протокола?
CC17
uint32_t host=ntohl(net);
Вопрос 5 из 25
Как узнать порядок байтов во время выполнения без нарушения правил доступа через несовместимый тип?
CC17
uint16_t x = 1;
/* определите порядок байтов, не обращаясь через несовместимый тип */
Вопрос 6 из 25
Что возвращает `_Alignof(double)`?
CC17
size_t a=_Alignof(double);
Вопрос 7 из 25
Гарантирует ли `malloc` подходящее выравнивание для обычных объектных типов?
Вопрос 8 из 25
Почему `uint32_t *p=(uint32_t*)(buf+1); *p` опасно?
CC17
unsigned char buf[8];
uint32_t x=*(uint32_t*)(buf+1);
Вопрос 9 из 25
Как безопасно загрузить невыровненное 32-битное значение в представлении хоста?
CC17
const unsigned char *p = packet + 1; /* адрес может быть невыровнен */
uint32_t x;
/* Нужно перенести sizeof x байтов в правильно выровненный объект x. */
Вопрос 10 из 25
Какое ограничение установлено для `aligned_alloc` в C11?
Вопрос 11 из 25
Зачем структуре может понадобиться заполнение после последнего поля?
Вопрос 12 из 25
Что может изменить перестановка полей?
CC17
struct A{ char c; double d; int i; };
struct B{ double d; int i; char c; };
Вопрос 13 из 25
Почему `memcmp(&a,&b,sizeof a)` может сказать “не равны” при равных полях?
CC17
return memcmp(&a,&b,sizeof a)==0;
Вопрос 14 из 25
Можно ли включать байты заполнения структуры в стабильный файловый формат?
Вопрос 15 из 25
Как узнать смещение поля переносимо в данной реализации?
CC17
struct record {
    char tag;
    double value;
    unsigned flags;
};
/* Требуется получить смещение поля value в этой реализации. */
Вопрос 16 из 25
Что в стандарте C называют объектным представлением значения?
Вопрос 17 из 25
Гарантирует ли одно значение `float` одинаковое представление байтами на всех платформах?
Вопрос 18 из 25
Когда корректно копировать структуру в другой объект через `memcpy`?
CC17
struct S dst,src; memcpy(&dst,&src,sizeof dst);
Вопрос 19 из 25
Почему чтение неинициализированного автоматического int опасно?
CC17
int x; printf("%d\n",x);
Вопрос 20 из 25
Можно ли использовать байты заполнения структуры как источник случайных данных?
Вопрос 21 из 25
Как быстро посмотреть байты файла со смещениями и печатным представлением?
CC17
$ ls -l packet.bin
-rw-r--r-- 1 user user 64 packet.bin
$ /* выберите команду для просмотра смещений и байтов файла */
Вопрос 22 из 25
Какой флаг Clang/GCC включает набор проверок UBSan, в том числе диагностику некоторых неверно выровненных доступов?
CC17
unsigned char raw[sizeof(uint32_t) + 1];
uint32_t value = *(uint32_t *)(raw + 1); /* возможное нарушение выравнивания */
/* Выберите флаг диагностической сборки. */
Вопрос 23 из 25
Что полезно вывести для ABI-диагностики структуры?
CC17
struct T {
    char tag;
    int x;
    double value;
};
/* сравниваются две сборки с разным ABI */
Вопрос 24 из 25
Зачем `_Static_assert(sizeof(uint32_t)==4,...)`?
Вопрос 25 из 25
Почему один шестнадцатеричный снимок памяти на x86 не доказывает переносимость?

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

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

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

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