Ну, это утверждение
char lookup_ext[8192] = {0}; // Gets filled later
Создает массив локально или нелокально, в зависимости от того, где находится определение. Инициализируя его, агрегатный инициализатор инициализирует все его элементы до нуля (первый явно, остальные неявно). Поэтому мне интересно, почему ваша программа выводит ненулевые значения. Если заполнение не произойдет до чтения, это имеет смысл.
unsigned short *slt = (unsigned short*) lookup_ext;
Это будет интерпретировать байты, составляющие массив, как беззнаковые короткие объекты, когда вы читаете из цели этого указателя. Строго говоря, вышеприведенное поведение не определено, поскольку вы не можете быть уверены, что массив подходит для выравнивания, и вы читали бы из указателя, который не указывает на тип исходного заостренного типа (unsigned char <-> unsigned short). В C ++ единственный переносимый способ считывания значения из некоторого другого модуля (простые старые данные. Это все структуры и простые типы, которые возможны и в C (например, короткие), в широком смысле) - использование таких библиотечных функций, как memcpy
или memmove
.
Таким образом, если вы прочитаете *slt
выше, вы интерпретируете первые sizeof(*slt)
байты массива и пытаетесь прочитать его как беззнаковое короткое (это называется type pun
).