Прежде всего, обратите внимание, что переменная n
не требуется выделять просто потому, что она volatile
. Поскольку ваша программа не ссылается на эту переменную, компилятор не может сделать что-либо значимое с ней, и она не выделяется. Удаление n
из вашей программы приводит к тому же выводу, так что это не объясняет «выключено на 1».
Как упоминалось в комментариях, упаковка 1 не имеет никакого смысла для структуры с один uint32_t
член. Эта прагма, однако, меняет требование выравнивания для структуры с 4 на 1. Вы можете проверить это с помощью C11 _Alignof(TEST)
.
Это, в свою очередь, означает, что компилятор может свободно размещать структуру по любому адресу, который ему нравится. Очевидно, есть что-то еще с размером 1 байт, выделенным в том же сегменте памяти, что и ваша переменная в данной системе, и поэтому вашей структуре просто передали следующий доступный адрес. «CRT» (стартовый код), а также стандартные функции lib могут нуждаться в размещении переменных сверх тех, которые явно объявлены программистом.
Примечательно, что неправильный доступ делает код медленнее во многих системах, и может вызывать программу cra sh на других.