По сути, вы правы в том смысле, что, поскольку вы обращаетесь к указателю int *, он извлечет 4 байта вместо 2, зарезервированных для хранения 's', и результирующий контент не будет идеальным отражением того, что ' s 'действительно означает.
Однако, скорее всего, это не приведет к сбою, так как 's' находится в стеке, поэтому в зависимости от того, как ваш стек расположен в данный момент, вы, скорее всего, будете читать данные, помещенные во время пролога 'main' функции ...
Смотрите, чтобы программа аварийно завершилась из-за недопустимого доступа к памяти чтения, вам нужно получить доступ к области памяти, которая не отображается, что вызовет «ошибку сегментации» на уровне пользовательского мира, в то время как «ошибка страницы» на уровне ядра. Под «отображением» я подразумеваю, что у вас есть известное отображение между областью виртуальной памяти и физической областью памяти (такое отображение обрабатывается операционной системой). Вот почему, если вы получите доступ к NULL-указателю, вы получите такое исключение, потому что на уровне пользовательского мира нет действительного отображения. Действительное сопоставление обычно дается вам, вызывая что-то вроде malloc () (обратите внимание, что malloc () - это не системный вызов, а умная оболочка, которая управляет вашими блоками виртуальной памяти). Ваш стек не является исключением, поскольку он является просто памятью, как и все остальное, но некоторая предварительно отображенная область уже создана для вас, поэтому при создании локальной переменной в блоке вам не нужно беспокоиться о ее расположении в памяти, поскольку она обрабатывается для вы и в этом случае вы не получаете доступ достаточно далеко, чтобы достичь чего-то не нанесенного на карту.
Теперь допустим, что вы делаете что-то подобное:
short s = 10;
int *i = (int *)&s;
*i = -1;
Тогда в этом случае ваша программа с большей вероятностью завершится сбоем, поскольку в этом случае вы начнете перезаписывать данные. В зависимости от данных, к которым вы прикасаетесь, эффект этого может варьироваться от безобидного неправильного поведения программы до сбоя программы, если, например, вы перезаписываете адрес возврата, помещенный в стек ... Повреждение данных является для меня одним из самых сложных (если не самым сложным) ) категория ошибок, с которой нужно иметь дело, поскольку ее влияние может повлиять на вашу систему случайным образом с недетерминированным шаблоном и может произойти спустя много времени после фактического выполнения исходных оскорбительных инструкций.
Если вы хотите больше узнать об управлении внутренней памятью, вы, вероятно, захотите изучить Управление виртуальной памятью в проектах операционных систем.
Надеюсь, это поможет,