a
является целым числом и получает значение 10.
b
является целым числом и получает в качестве значения целое число, адрес a
приведен как целое число.
c
является указателем на int и получает значение b
, приведенное к указателю на int.
Значение b
было адресом a
, но приведено какинт.
Так что c
«должен» указывать на a
, а с *c
вы «должны» получить 10. Проблема в том, что на вашей машине размер int
и размер a pointer to an int
не совпадают, и в первом приведении вы урезали значение &a
до размера int и потеряли несколько цифр адреса.
Теперь в b
есть int, содержащий только некоторую цифру адреса a
и, следовательно, совершенно другой адрес, поэтому при попытке доступа к памяти по этому адресу (с *c
)вы не обращаетесь к a
, но где-то еще есть память, которая в этом случае оказывается недействительной.