2016-05-03 12 views
1

コードenviron=NULLを使用すると、そのプロセスの環境全体が消去されていることを意味します。全体の環境を消去する

しかし、なぜenvrion=NULLはそのプロセスの環境全体を消去しているのだろうと思います。

基本的に、環境変数はプロセスのスタックアドレス範囲より下のアドレス空間にあります。

ので、environ変数は、そのアドレス空間を示すされ、そしてenviron=NULLenvironがちょうどもうそのアドレス空間を示すされていないことを意味し、私は環境変数のために存在するメモリの内容を消去しない意味します。

しかし、なぜこれは環境全体を消去するのですか?

+1

私があなたを得ているなら、あなたは正しいです。このコードを使用すると、環境は無効になりますが、アドレス空間はまだ生きています。 [man](http://www.gnu.org/software/libc/manual/html_node/Environment-Access.html)のように:_配列の最後の要素はヌルポインタです。 – LPs

+4

注意する必要がありますこれは** Unix特有の**です。 C言語自体には、実装定義の環境リスト*を検索するための 'getenv()'を定義する 'environ'という概念はありません。そして、Unixでさえ、 'extern char ** environ'が文字列へのポインタの配列を指していることと、この配列の最後のポインタがNULLという値を持っていることをマンページで定義しているので、' environ = NULL'基本的には未定義の動作を呼び出すことです。 – DevSolar

+0

@John Bollinger 'envrion = NULL'と同じ' clearenv() 'ではなく' * envrion == NULL'ですか?したがって、 'environ = NULL'のとき、' setenv() 'または' putenv() 'は" name = value "文字列を指す新しい環境リストを作成します。 –

答えて

4

C標準ライブラリは、environポインタを介して環境にアクセスします。そのポインタを別のものに設定すると、標準ライブラリは以前に設定された環境変数を検出しなくなり、環境をクリアしたり、ポインタをenvironに設定したものに設定したりするという効果があります。

+0

実際には、 'environ'ポインタを変更しても、ライブラリがそのポインタを使用して環境内の特定のエンティティを見つけようとすることはありません。 '環境 'を変更する確率は未定義の動作(100%近く)です。強くお勧めします: 'environ'変数の内容を決して変更しないでください。 – user3629249

関連する問題