2

環境の最後のアドレスを出力する必要があります。

これで最初のアドレスを取得できることはわかっています(または、取得したと思います)。

extern char **environ;
printf("first address %p\n",&(*environ));

しかし、最後の住所はどうですか?

4

3 に答える 3

2

環境の配列が 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]);
于 2013-10-16T16:20:00.927 に答える
2

従来、environ(7)で説明されているように、environ配列はNULLポインターで終了します。

実際には、カーネルはexecve(2)の後にプロセスの初期スタックをセットアップし 、環境はその初期スタックで末尾にNULL. そのため、その規則の一部は、アプリケーション バイナリ インターフェイスごとにカーネルに実装されています。規則の他の部分は、起動ルーチン (実行可能ファイルのエントリ ポイント) で実装さcrt*.omainます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.
于 2013-10-16T16:18:16.457 に答える