75

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

  • getenv()
  • extern char **environ;

しかし、上記以外に、環境変数を標準の一部と見なすためchar *envp[]の3番目の引数として使用していますか?main()

#include <stdio.h>

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

char *envp[]ポータブルですか?

4

4 に答える 4

66

この関数getenvは、C 標準で指定されている唯一の関数です。functionputenvと externenvironは POSIX 固有です。

編集

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

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

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

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

于 2012-04-25T18:20:19.537 に答える
20

ポータブルではありません。*envp[]は従来の UNIX のものであり、最新のすべての UNIX システムがそれを実装しているわけではありません。

また、補足として、ポインタトラバーサルを実行してオーバーフローすることでenvpにアクセスできます...しかし、それは安全なプログラミング*argv[]とは言えません。プロセス メモリ マップを見ると、 のすぐ上にあることがわかります。envp[]argv[]

于 2012-04-25T18:22:23.507 に答える
18

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

a)int main(void)

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

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

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

于 2012-04-25T18:20:45.073 に答える
9

3 番目の引数は、Microsoft C および GNU GCC で有効です。

Visual Studio 2015: main への引数

GNU C プログラミング チュートリアル: 環境変数

于 2015-07-30T11:35:07.607 に答える