Почему выбивает исключение Run-Time Check Failure #2 - Stack around the variable 'UnitStateWord' was corrupted?

#include <iostream>
#include <stdio.h>
#include <Windows.h>
using namespace std;

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

   char m,
        n,
        l,        
        w;
    unsigned __int16 UnitStateWord;
    printf("Введите слово состояния устройства \n");
    printf("(16-ричное число от 0 до 0xFFFF) >");
    scanf_s("%x", &UnitStateWord);

    m = (UnitStateWord >> 13) & 7;
    n = (UnitStateWord >> 10) & 7;
    l = (UnitStateWord >> 8) & 1;
    w = UnitStateWord & 0xFF;

   
    return 0;
     
}

Ответы (1 шт):

Автор решения: Harry

Потому что

unsigned __int16 UnitStateWord;  

подразумевает 2 байта в UnitStateWord, а "%x" - четырехбайтовое целое. В результате запись идет в память за пределами переменной и портит стек...

Кстати, VC++ прямо говорит об этом:

t.cpp(18): warning C4477: "scanf_s": в строке форматирования "%x" требуется аргумент типа "unsigned int *", но вариативный аргумент "1" имеет тип "unsigned short *"
t.cpp(18): note: рекомендуется использовать "%hx" в строке форматирования

Чем вы компилировали? или просто не поняли сообщение?

→ Ссылка