C言語のmain関数の仮引数について

最近のC言語の規格では, main関数の仮引数は基本的に

int main(void)

int main(int argc, char **argv)

のどちらか(またはこれらと同等のもの)にしなければならない(C99, C11).

のだが, 今日ネット上で

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

というのを見た. ので調べた.

envpは広く利用されているが, 移植性に問題がある(C99, C11). envpにはargvと同じ形式で環境変数が記憶される. 検索してヒットしたページによると, どうやらUnix系OSでは伝統的に使われていたらしい.

現代的なプログラムで環境変数を取得する場合は標準ライブラリのgetenvを利用するべきである. POSIXシステムならば,

#include <unistd.h>
extern char **environ;

とすることで, envpと同等のグローバル変数environが利用できる.

このリンクの付け方はあまりよろしくない気がする.

あと,なぜ今まで知らなかったのかよくわからないが, argv[argc] == NULLは保証されている.