web-dev-qa-db-ja.com

main()ポータブルへの3番目の引数としてchar * envp []

Cプログラムで環境変数を取得するには、次を使用できます。

  • getenv()
  • _extern char **environ;_

しかし、上記以外に、main()の3番目の引数として_char *envp[]_を使用して、標準の一部と見なされる環境変数を取得していますか?

_#include <stdio.h>

int main(int argc, char *argv[], char *envp[])
{
    while(*envp)
        printf("%s\n",*envp++);
}
_

_char *envp[]_は移植可能ですか?

58

関数getenvは、C標準で指定されている唯一のものです。関数 putenv およびextern environ はPOSIX固有です。

編集

mainパラメーターenvpはPOSIXでは指定されていませんが、広くサポートされています。

環境リストにアクセスする別の方法は、main()関数の3番目の引数を宣言することです。

int main(int argc, char *argv[], char *envp[])

この引数は、environと同じ方法で処理できますが、そのスコープはmain()に対してローカルです。この機能はUNIXシステムで広く実装されていますが、スコープの制限に加えて、SUSv3で指定されていないため、使用を避ける必要があります。

47
cnicutar

ポータブルではありません。 *envp[]は伝統的なUNIXのものであり、現代のすべてのUNIXシステムがそれを実装しているわけではありません。

また、サイドノートとして、*argv[]を越えてポインタートラバーサルを実行してenvpにアクセスすることもできますが、それを考慮することはできませんsafeプログラミング。プロセスのメモリマップを見ると、envp[]argv[]のすぐ上にあることがわかります。

17
skyel

この規格では、mainの2つの形式について説明しています( C99標準(pdf) の5.1.2.2.1を参照)

a)int main(void)

そして

b)int main(int argc, char **argv)または同等のもの

また、実装で他の形式を定義できます(3番目の引数を許可できます)。

c)または他の実装定義の方法で。

14
pmg
6
user3683366