Прежде всего, вот что говорит языковой стандарт ( n1256 ):
5.1.2.2.1 Запуск программы
...
2 Если они объявлены, параметры главной функции должны соответствовать следующим
Ограничения:
- Значение
argc
должно быть неотрицательным.
argv[argc]
должен быть нулевым указателем.
- Если значение
argc
больше нуля, элементы массива argv[0]
через
argv[argc-1]
включительно должен содержать указатели на строки, которые даны
значения, определенные реализацией средой хоста до запуска программы.
намерение состоит в том, чтобы предоставить программе информацию, определенную до ее запуска
из другого места в размещенной среде. Если среда хоста не способна
предоставление строк с буквами в верхнем и нижнем регистре, реализация
убедитесь, что строки получены в нижнем регистре.
- Если значение
argc
больше нуля, строка, на которую указывает argv[0]
представляет имя программы ; argv[0][0]
должен быть нулевым символом, если
Имя программы недоступно в хост-среде. Если значение argc
больше единицы строки, на которые указывают argv[1]
до argv[argc-1]
представляют программные параметры .
- Параметры
argc
и argv
и строки, на которые указывает массив argv
, должны
быть изменяемыми программой и сохранять их последние сохраненные значения между программами
запуск и завершение программы.
Последний пункт наиболее интересен в отношении , где хранятся строковые аргументы, переданные main
. Они должны быть модифицируемыми и иметь статический экстент, что накладывает некоторые ограничения на то, где они находятся в памяти. Однако со стороны определения языка не требуется, чтобы они находились в одном и том же месте при каждом запуске программы.
Я сделал краткий поиск в MSDN, чтобы выяснить, говорят ли они что-нибудь явное, но еще ничего не нашел. Это, вероятно, сводится к ASLR, как упоминалось в комментариях к ФП.