uint16_t* ptr16 = (uint16_t*) &ptr;
Вы переинтерпретируете ptr
как указатель на uint16_t
, но такого объекта по этому адресу не существует. Попытка доступа к несуществующему объекту приводит к неопределенному поведению (по крайней мере, до C ++ 20; в некоторых случаях оно создает неявное создание тривиальных объектов).
uint16_t* ptr16 = (uint16_t*) &ptr;
for(uint i=0; i<size; i++) {
buffer[i] =(uchar) *(ptr16)>>4;
ptr16++;
Предполагается, что uchar
имеет ширину 8 бит типа, нет никакого способа, которым массив size
8-битных объектов будет соответствовать size
числу 16-битных объектов. Вы переполняете массив.
Редактировать: все вышеперечисленное применимо, если бы вы написали (uint16_t*) ptr;
, что имело бы немного больше смысла, даже если все еще не работает. Все вышеперечисленное относится и к &ptr
, за исключением того, что это, вероятно, не то, что вы хотели.