Евгений Шатунов, твои вопросы невнятно для меня поставлены. но что такое статическая переменная я тебе смогу объяснить. статическая переменная создается и инициализируется 1 раз, сохраняет свое значение до выхода из программы. сохраняет свое значение после выхода из блока.
oftywave, мои вопросы подразумевают некоторое знание, обладая котором в вопросе можно сориентироваться.
Хорошо что ты открыто говоришь о том, что не сориентировался.
С твоих слов статическая переменная ни чем не отличается от утекшей динамической памяти. Ее тоже один раз выделили и один раз проинициализировали, а потом она утекла и прожила до кона жизни процесса.
И, все-таки, это не верно. Тебе нужна информация о природе статического времени жизни: [1], [2]. Это как минимум.
Дополнительно, тебе стоит сразу понять проблему фиаско статической инициализации.
Статической переменную (или константу) делает расположение этой переменной в памяти с характеристикой статического времени жизни (static storage-duration).
Статический объект от глобального отличается тем, что определен с применением слова static, которое разрешает только внутреннее связывание (internal linkage) объекта в рамках текущего модуля трансляции. Глобальные объекты имеют внешнее связывание (external linkage) и могут быть использованы в других модулях трансляции. Возможность связывания - это именно то, что отличает глобальные объекты от динамической памяти. Для динамической памяти связывание недоступно.
Объекты в памяти статического времени жизни инициализируются до начала работы главной функции и деинициализируются после выхода из главной функции.
При этом, инициализация происходит в соответствии с общим правилом инициализации любого объекта любого типа. В случае с тривиальными типами инициализация объекта будет фиктивной. Тривиальные типы не имеют функционального конструктора по умолчанию и всегда должны быть явно инициализированы.
Все это должно говорить тебе о том, что если ты пропускаешь явную инициализацию глобального объекта, для его инициализации будет использован конструктор по умолчанию, который пуст для тривиальных типов, в следствии чего глобальные объекты тривиального типа, равно как и локальные, после инициализации будут содержать произвольный мусор.
Секция глобальных полей в бинарном образе может не содержать флаг очистки при своей разметке. Такое поведение бывает у оптимизированных приложений. В результате, используя в своем коде неинициализированные глобальные объекты ты вносишь в свою программу неопределенное поведение, как, в целом, и говорится в стандарте.
Евгений Шатунов, спасибо за такой развернутый мой ответ был основан на том что я смог изучить исходя из доступной (котору я смог найти) информации. очень приятно, что есть такие как ты. как ты сказал ранее, разница между годом и практически 20 лет имеет свою разницу.
хотел бы лично у тебя попросить материалы и сайты для изучения cpp, если не составит труда составить.
oftywave, это уже выходит за рамки текущего вопроса. Оффтоп запрещен правилами.
Тебе будет лучше оформить это как свой новый вопрос. В этом случае ответить на него смогу не только я, но и другие люди тоже.
jcmvbkbc, как по мне лучше один раз задать значение, чем потом мучаться с отладкой, стандарт это хорошо, но никто не застрахован что именно этот компилятор его не соблюдает или что стандарт в будущем не поменяется и ранее рабочий код после очередной сборки превратится в тыкву.