Поясните, пожалуйста.
Ну вот, к примеру, объявляете вы переменную в коде таким образом:
При старте программы переменной "i" присваивается значение "1". Полагаю, в большинстве случаев этим занимается операционная система, под управлением которой запускается данная программа. В случае же отсутствия таковой сама программа должна содержать небольшой загрузчик, выполняющий эту функцию. Разумеется, детали реализации непосредственно зависят от архитектуры используемого процессора. В любом случае происходит отображение области инициализированных данных, содержащихся в бинарном образе программы, хранящемся на информационном носителе, в область оперативной памяти, отведённую данной программе под инициализированные переменные. Во встраиваемых системах, где зачастую вся доступная память, в том числе и долговременная, организована в виде единого адресного пространства, используются понятия загрузочного адреса, откуда берутся данные для инициализации, и исполнительного адреса в оперативной памяти, куда они кладутся на этапе инициализации (об этом можно почитать, например, здесь
http://www.keil.com/support/man/docs/armlink/armlink_pge1362065902090.htm. Вот здесь можно посмотреть на описание скриптов линковщика, в частности, позволяющих управлять размещением секций:
https://www.math.utah.edu/docs/info/ld_toc.html#SEC4). После запуска программы никто не мешает изменить значение переменной i с единицы на любое другое, и вы не сможете доступиться к единичке (которая, разумеется, никуда не делась из бинарного образа программы, хранящегося в долговременной памяти) по той причине, что её может попросту не быть в памяти процесса.