Является ли char * envp [] третьим аргументом для main() portable
Чтобы получить переменную окружения в программе C
, можно было бы использовать следующее:
-
getenv()
-
extern char **environ;
Но кроме вышеупомянутого, используется char *envp[]
в качестве третьего аргумента для main()
, чтобы получить переменные среды, рассматриваемые как часть стандарта?
#include <stdio.h>
int main(int argc, char *argv[], char *envp[])
{
while(*envp)
printf("%s\n",*envp++);
}
Является ли char *envp[]
переносимым?
Ответы
Ответ 1
Функция getenv
является единственной, указанной стандартом C. Функция putenv
, а extern environ
являются специфичными для POSIX.
ИЗМЕНИТЬ
Параметр main
envp
не указан POSIX, но широко поддерживается.
Альтернативным методом доступа к списку окружения является объявление третий аргумент функции main():
int main(int argc, char *argv[], char *envp[])
Затем этот аргумент можно обрабатывать так же, как и для среды, с разница в том, что его область локальна для main(). Хотя эта функция широко внедряемая в системах UNIX, ее следует избегать, поскольку, в дополнение к ограничению объема, он не указан в SUSv3.
Ответ 2
Не переносится. *envp[]
- традиционная вещь UNIX, и не все современные системы UNIX ее реализуют.
Также в качестве дополнительной заметки вы можете получить доступ к envp, совершив обход указателя над *argv[]
, переполнив его... но я не думаю, что это можно считать безопасным программированием. Если вы посмотрите на карту памяти процесса, вы увидите, что envp[]
находится чуть выше argv[]
.
Ответ 3
Стандарт описывает два формата для main
(см. 5.1.2.2.1 в C99 Standard (pdf))
a) int main(void)
и
b) int main(int argc, char **argv)
или эквивалентный
и позволяет реализациям определять другие форматы (которые могут допускать третий аргумент)
c) или каким-либо другим способом реализации.
Ответ 4
Третий аргумент действителен в Microsoft C и GNU GCC:
Visual Studio 2015: Аргументы для основного
Учебное пособие по программированию GNU C: переменные окружения