Является ли char *envp[] в качестве третьего аргумента для main() переносимым
Чтобы получить переменную среды в 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[]
портативный компьютер?
4 ответа
Функция getenv
единственный, указанный стандартом C. Функция putenv
и экстерьер environ
являются POSIX-специфичными.
РЕДАКТИРОВАТЬ
main
параметр envp
не указывается POSIX, но широко поддерживается.
Альтернативный метод доступа к списку окружения - объявить третий аргумент функции main():
int main(int argc, char *argv[], char *envp[])
Этот аргумент может быть обработан так же, как и Environment, с той разницей, что его область видимости является локальной для main(). Хотя эта функция широко реализована в системах UNIX, ее следует избегать, поскольку в дополнение к ограничению области она не указана в SUSv3.
Это не портативный. *envp[]
это традиционная вещь UNIX, и не все современные системы UNIX реализуют ее.
Также в качестве примечания вы можете получить доступ к envp, выполнив обход указателя *argv[]
Переполнение... но я не думаю, что это можно считать безопасным программированием. Если вы посмотрите на карту памяти процесса, вы увидите, что envp[]
чуть выше argv[]
,
Стандарт описывает два формата для main
(см. 5.1.2.2.1 в стандарте C99 (pdf))
а) int main(void)
а также
б) int main(int argc, char **argv)
или эквивалент
и это позволяет реализациям определять другие форматы (которые могут позволить третий аргумент)
c) или каким-либо другим способом, определяемым реализацией.
Третий аргумент действителен в Microsoft C и GNU GCC: