Как отмечают многие другие ответы, точный механизм, используемый реализацией компилятора для передачи аргументов в main, не определен стандартом (как и механизм, который компилятор использует для передачи любых аргументов в функцию).Строго говоря, компилятору даже не нужно передавать ничего полезного в этих параметрах, поскольку значения определяются реализацией.Но ни один из них не является особенно полезным ответом.
Типичная программа на C (или C ++) скомпилирована для так называемой «размещенной» среды выполнения (с использованием функции main()
в качестве начальной точки вашей программытребований к размещаемой среде).Главное, что нужно знать, это то, что компилятор упорядочивает вещи так, что когда исполняемый файл запускается операционной системой, среда выполнения компилятора первоначально получает управление, а не функцию main()
.Код инициализации среды выполнения выполняет любую необходимую инициализацию, включая выделение памяти для аргументов main()
, затем передает управление main()
.
Память для аргументов main()
может быть получена из кучи, может быть выделен в стеке (возможно, с использованием методов, которые недоступны для стандартного кода C), или может использовать статически распределенную память, хотя это менее вероятный вариант только потому, что он менее гибок.Стандарт требует, чтобы память, используемая для строк, на которые указывает argv
, была модифицируемой и чтобы изменения, внесенные в эти строки, сохранялись на протяжении всего жизненного цикла программы.
Просто имейте в виду, что до выполнения main()
вполненемного кода уже запущено, что настраивает среду для запуска вашей программы.