В книге под названием Programming Windows в одном из примеров у нас есть эта строка:
ReadFile (hFile, buffer, MAXREAD, &i, NULL) ;
i
здесь было ранее объявлен как int
, но 4-й аргумент ReadFile
– это LPDWORD
, что является определением типа для DWORD*
, а DWORD
– это определение типа для unsigned long
. Это эффективная игра слов. В большинстве систем unsigned long
и int
имеют одинаковый размер, но я думаю, что доступ к переменной, как если бы это был какой-то другой тип, является неопределенным поведением. Это нормально? Это нормально, только если размеры одинаковые? Это УБ? Я проверил пару веб-сайтов с ошибками, и они, похоже, не перечисляют это. Я что-то упускаю?
unsigned long
иint
имеют одинаковый размер Нет, это не так. Windows является исключением здесь. Практически в любой другой 64-битной архитектуреint
составляет 32 бита, а[unsigned] long
— 64 бита. - person Andrew Henle   schedule 02.04.2020i
должен быть объявлен какDWORD
. - person user3386109   schedule 02.04.2020