Я знаю, что код правильный, потому что он отлично работал на первом ПК
Вы не знаете ничего подобного.
У вас неопределенное поведение, и одним из вполне обоснованных последствий является программа, которая всегда работает.Или всегда работает, кроме субботы, или всегда работает до тех пор, пока вы не закончите тестирование и не отправите его платящему клиенту, или всегда работает на одном компьютере и всегда выходит из строя на другом.
Поведение - undefined , а не «определен для определенного согласованного наблюдаемого режима сбоя».
В частности, реальный риск неопределенного поведения заключается не просто в том, что результат какой-либо операции имеет неопределенное значение ,но то, что оно может иметь неопределенные и непредсказуемые побочные эффекты - в явно не связанных областях вашей программы или в системе в целом.
Даже в этом случаепо крайней мере, показать значение мусора внутри него
Это сделал.Но затем вы попросили разыменовать это мусорное значение.
Чтение любой переменной с неопределенным значением само по себе является неопределенным поведением, поэтому первая часть UB читает значение указателя.
Следование (разыменование) указателя, который не указывает на допустимый объект, также является неопределенным поведением, поскольку вы не знаете, правильно ли выровнено для типа неуказанное значение, которое вы незаконно интерпретировали как адрес, илиотображается в адресном пространстве вашего процесса.
Если вы успешно загрузили какое-то целое число с этого адреса, это третья часть неопределенного поведения, потому что снова его значение не определено.
Итак,Непосредственные наихудшие ловушки (со значениями аппаратного перехвата и ограничительным выравниванием):
- прочитайте неуказанное значение указателя, получите представление прерывания, умрите с аппаратным прерыванием
- ИЛИ прочитайтенеопределенное значение указателя, интерпретировать его как неверно выровненный адрес, умереть с ошибкой шины
- ИЛИ следовать за неопределенным указателем на не назначенный адрес, умереть с нарушением сегмента
- ИЛИ пережить все предыдущиешаги - по чистой случайности - загрузить случайное значение из некоторого места в памяти.Затем умрите, потому что это значение представляет собой ловушку.
Но если ваш процесс просто умирает, воспроизводимо, вы можете легко отладить и исправить его без вредных последствий.В этом смысле сбой в момент вызова UB на самом деле является наилучшим возможным результатом.Альтернативы хуже, менее предсказуемы и сложнее в отладке.