Комментарии 13
Закреплённые комментарии
Какие виртуальные адреса? В примере память выделяется на стеке.
А стек находится в виртуальном адресном пространстве.
Да всё равно где он находится. До main() его уже потрогал тот код, который в main() передаёт управление. И там будет мусор.
Секундочку. В main передаёт управление загрузчик, который при каждом вызове исполняемого файла делает в точности одно и то же. И также одно и то же делает bash (даже если не учитывать, что он находится в другом адресном пространстве). Даже если загрузчик использует с какой-то целью память процесса (например, стек), то у него нет никаких оснований делать это с разными результатами при разных вызовах. Вот я и спрашиваю, где именно возникают эти байты и различие в них?
У меня при этом достаточно оперативной памяти и нет вытеснения страниц, которое могло бы привести к перераспределению физических адресов.
Даже если взять, что загрузчик каждый раз делает идентичные вычисления и сохраняет одинаковые данные в стекле, объявление "int a [100]" на них все равно не попадает, а размещается выше по стеклу.
Моё предположение в том, что выдаваемое программе при загрузке адресное пространство уже было ранее использовано другими процессами (и естественно чистить его никто не будет). Вот так и получается, что мы читаем мусорные данные, которые на самом деле являются фактом жизни в этих физических адресах других процессов
Моя версия в "int a [100];" каждый раз память выделяется в разных местах.
попробуйте запустить этот код на какой-нибудь железке, без внешней сети и внешних сенсоров, и желательно чтобы была однопоточная.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Откуда берётся мусор? Рассмотрим следующую программу: #include <stdio.h> int main () { int a [100]; int i; ...