LINUX.ORG.RU

История изменений

Исправление LamerOk, (текущая версия) :

если компилятор не может отследить значения какого типа было записано в область памяти, то он должен трактовать его

Нет. Одна из особенностей си - компилятор не гарантирует соблюдение семантики во всех синтаксически корректных инструкциях. Эта работа лежит на программисте. Компилятор будет трактовать данные в соответствии с объявленным типом. При касте указателя гарантии компилятора снимаются.

там лежит то, что мы сказали типом указателя и что всё выровнено как надо (а если на самом деле лежит не то и выравнено не так, то мы получаем UB).

Всё хуже. Мы получаем UB, если производим запись по указателю одного типа, а читаем - другого. Вообще не зависимо ни от чего это 100% UB, потому что компилятор не может гарантировать в этом сценарии семантическую корректность прочитанных данных.

Вот если пишем + читаем последовательно по указателям разного типа в одну область памяти - то ок.

Исходная версия LamerOk, :

если компилятор не может отследить значения какого типа было записано в область памяти, то он должен трактовать его

Нет. Одна из особенностей си - компилятор не гарантирует соблюдение семантики. Эта работа лежит на программисте. Компилятор будет трактовать данные в соответствии с объявленным типом. При касте указателя гарантии компилятора снимаются.

там лежит то, что мы сказали типом указателя и что всё выровнено как надо (а если на самом деле лежит не то и выравнено не так, то мы получаем UB).

Всё хуже. Мы получаем UB, если производим запись по указателю одного типа, а читаем - другого. Вообще не зависимо ни от чего это 100% UB, потому что компилятор не может гарантировать в этом сценарии семантическую корректность прочитанных данных.

Вот если пишем + читаем последовательно по указателям разного типа в одну область памяти - то ок.