Найти тему

Что будет, если вместо 4 байтов записать 8

Ранее я рассказывал о том, как можно привести тип указателя, и записать адрес переменной одного типа в указатель другого типа. Всё это можно, но не нужно (без очень крайней необходимости). Потому что эти манипуляции могут привести к очень-очень труднонаходимым ошибкам.

Вот пример:

Ранее я рассказывал о том, как можно привести тип указателя, и записать адрес переменной одного типа в указатель другого типа. Всё это можно, но не нужно (без очень крайней необходимости).

Обратите внимание, что мы в указатель типа double записали адрес целочисленной переменной n2 типа int. Затем по этому адресу мы записали какое-то число. Переменную n1 мы не трогали. И, тем не менее, если после этих действий мы выведем её значение на экран, то получим “неожиданный” результат:

Ранее я рассказывал о том, как можно привести тип указателя, и записать адрес переменной одного типа в указатель другого типа. Всё это можно, но не нужно (без очень крайней необходимости).-2

Почему это произошло? Потому что переменные n1 и n2 объявлены “рядом”, и могут иметь смежные адреса:

  • У n1 адрес 0x6ffe04
  • У n2 адрес 0x6ffe00

Но тип double занимает не 4 байта, а 8. Поэтому, когда мы сохранили в указатель адрес переменной n2, а потом по этому адресу записали какое-то число, то этим числом были заполнены 8 байтов (а нашем примере это 8 байтов в диапазоне адресов 0x6ffe00…0x6ffe07). И, поскольку переменные n1 и n2 у нас хранились рядом, то переменная n1 была перезаписана, хотя мы с ней “ничего не делали”.

В итоге в переменной n1 вместо числа 65535 оказалось число 1072693248. Почему именно это число - это уже другой вопрос. Это связано с особенностью представления чисел в памяти компьютера.

Главный же вывод - не надо шалить с адресным пространством. Даже если такая возможность есть.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.