Ранее я рассказывал о том, как можно привести тип указателя, и записать адрес переменной одного типа в указатель другого типа. Всё это можно, но не нужно (без очень крайней необходимости). Потому что эти манипуляции могут привести к очень-очень труднонаходимым ошибкам.
Вот пример:
Обратите внимание, что мы в указатель типа double записали адрес целочисленной переменной n2 типа int. Затем по этому адресу мы записали какое-то число. Переменную n1 мы не трогали. И, тем не менее, если после этих действий мы выведем её значение на экран, то получим “неожиданный” результат:
Почему это произошло? Потому что переменные n1 и n2 объявлены “рядом”, и могут иметь смежные адреса:
- У n1 адрес 0x6ffe04
- У n2 адрес 0x6ffe00
Но тип double занимает не 4 байта, а 8. Поэтому, когда мы сохранили в указатель адрес переменной n2, а потом по этому адресу записали какое-то число, то этим числом были заполнены 8 байтов (а нашем примере это 8 байтов в диапазоне адресов 0x6ffe00…0x6ffe07). И, поскольку переменные n1 и n2 у нас хранились рядом, то переменная n1 была перезаписана, хотя мы с ней “ничего не делали”.
В итоге в переменной n1 вместо числа 65535 оказалось число 1072693248. Почему именно это число - это уже другой вопрос. Это связано с особенностью представления чисел в памяти компьютера.
Главный же вывод - не надо шалить с адресным пространством. Даже если такая возможность есть.
На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.