Ну, это полностью зависит от обстоятельств, может ли ваш исполняемый файл быть запущен на вашей новой системе или нет. Каждая операционная система определяет свой собственный формат файла. Например, вот как выглядит Windows EXE. Есть причина, почему они называются переносимыми исполняемыми файлами .
Когда ваш компилятор генерирует такой исполняемый файл, он сначала компилирует ваш код C в соответствующую сборку вашей целевой архитектуры, а затем упаковывает его в целевой формат исполняемого файла. Статические выделения памяти находят свое место в этом формате.
Вы можете представить exe-файл как своего рода образ памяти, который загружается в новое пространство памяти загрузчиком процессов операционной системы. Операционная система поддерживает смещение в этом месте и обеспечивает доступ к памяти всех программ в защищенном адресном пространстве своего процесса.
Чтобы ответить на ваш конкретный вопрос: перенос исполняемого файла между системами одной операционной системы и архитектуры обычно не представляет проблемы. Сценарий той же ОС, но с другой архитектурой машины, обычно может обрабатываться ОС посредством эмуляции (например, Rosetta в Mac OS эмулирует PowerPC на x86). Совместимость с 64/32 битами также обрабатывается таким же образом. Перенос между разными ОС обычно невозможен (для собственных исполняемых файлов), но все, что работает внутри виртуальных машин (java vm, .net CLR), не представляет проблем, так как загрузчик процессов загружает только виртуальную машину, а сама программа запускается оттуда.