環境の最後のアドレスを出力する必要があります。
これで最初のアドレスを取得できることはわかっています(または、取得したと思います)。
extern char **environ;
printf("first address %p\n",&(*environ));
しかし、最後の住所はどうですか?
環境の配列が NULL で終了している場合 (時々 の 3 番目のパラメータのようにmain()
)
extern char **environ;
int i = 0;
while (environ[i] != NULL) {
printf("environ[%d] = %p\n", i, environ[i]);
i++;
}
// environ is a "pointer to pointer to char". See http://cdecl.org/
// The last useful pointer in array `environ` should be a NULL.
printf("last address(or pointer) of the environment = %p\n", environ[i]);
// The address(pointer) of that last pointer(pointer) is ...
printf("address of the last address of environ = %p\n", &environ[i]);
従来、environ(7)で説明されているように、environ
配列はNULL
ポインターで終了します。
実際には、カーネルはexecve(2)の後にプロセスの初期スタックをセットアップし 、環境はその初期スタックで末尾にNULL
. そのため、その規則の一部は、アプリケーション バイナリ インターフェイスごとにカーネルに実装されています。規則の他の部分は、起動ルーチン (実行可能ファイルのエントリ ポイント) で実装さcrt*.o
れmain
ますenviron
。
したがって、チャーリー・バーンズの回答のようにループを作成して、その終わりを見つける必要があります。
char** environ_end;
for (environ_end = environ; *environ_end != NULL; environ_end ++) {};
// at this point, environ_end points to the end of the environment
// i.e. to the ending NULL entry there.