Является ли 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) или каким-либо другим способом реализации.