История изменений
Исправление LamerOk, (текущая версия) :
если компилятор не может отследить значения какого типа было записано в область памяти, то он должен трактовать его
Нет. Одна из особенностей си - компилятор не гарантирует соблюдение семантики во всех синтаксически корректных инструкциях. Эта работа лежит на программисте. Компилятор будет трактовать данные в соответствии с объявленным типом. При касте указателя гарантии компилятора снимаются.
там лежит то, что мы сказали типом указателя и что всё выровнено как надо (а если на самом деле лежит не то и выравнено не так, то мы получаем UB).
Всё хуже. Мы получаем UB, если производим запись по указателю одного типа, а читаем - другого. Вообще не зависимо ни от чего это 100% UB, потому что компилятор не может гарантировать в этом сценарии семантическую корректность прочитанных данных.
Вот если пишем + читаем последовательно по указателям разного типа в одну область памяти - то ок.
Исходная версия LamerOk, :
если компилятор не может отследить значения какого типа было записано в область памяти, то он должен трактовать его
Нет. Одна из особенностей си - компилятор не гарантирует соблюдение семантики. Эта работа лежит на программисте. Компилятор будет трактовать данные в соответствии с объявленным типом. При касте указателя гарантии компилятора снимаются.
там лежит то, что мы сказали типом указателя и что всё выровнено как надо (а если на самом деле лежит не то и выравнено не так, то мы получаем UB).
Всё хуже. Мы получаем UB, если производим запись по указателю одного типа, а читаем - другого. Вообще не зависимо ни от чего это 100% UB, потому что компилятор не может гарантировать в этом сценарии семантическую корректность прочитанных данных.
Вот если пишем + читаем последовательно по указателям разного типа в одну область памяти - то ок.