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

Другие вопросы по тегам