2009-07-09 3 views
2

Cプログラムを書くと、環境変数の名前が取得され、メモリアドレスが出力されます。単にgetenv()関数を使用します。 PATH - > ./test PATHのアドレスの場所を知りたいとしましょう。しかし、gdbでそのプログラムをデバッグすると、その変数のメモリ位置が異なります。そのような違いがある理由を詳細に説明できますか?プログラムを実行しているときに環境変数のメモリアドレスに違いがあるのはなぜですか?

より正確には:

./test PATH - GDBで> 0xbffffd96

デバッグ - > 0xbffffd53

[編集]あなたの説明をありがとう。私が実際に質問していることは、変数(この場合は環境変数)のメモリアドレスが異なるプログラムによってどのように変わるかです。たとえば、私は2プログラムのa.outを持っていると

./a.out B.OUT - > PATHのアドレスいくつかの番号がある

./b.out - > 2つの数の間のこの違いの原因を別の番号ので

、 ?私は何を求めているかを明確に示してくれることを願っています。ありがとうございます。

答えて

1

なぜ同じメモリの場所が毎回返されると思いますか? getenvは "指定された名前の値を含む文字列へのポインタ"を返します。 メモリ位置文字列が指定されていないか、その場所が後で上書きされるかどうかは指定されていません。

+0

私のあいまいな例には申し訳ありません。私のプログラムでは、次のようなものがあります:printf( "%p"、getenv( "PATH"))例えば – wakandan

+0

あなたの質問は曖昧ではありませんでした。私はあなたがメモリアドレス( "%p")について質問していることを理解しました。しかし、他の人が言うように、あなたはこれに気を付けるべきではありません。 –

4

通常、環境変数は「プロセスデータブロック」の一部であり、それらは開始プロセスから継承されます。デバッガでプログラムを実行している場合、そのデバッガには独自のプロセスデータブロックがあり、プログラムはそのプロセスデータブロックをデバッガから継承します。これは、IDEのプログラムデータブロックを継承した可能性があります。

これは問題ではありません。なぜなら、環境変数へのインターフェイスでは、そのような詳細が得られないからです。たとえば、Windowsでは、環境変数がUnicodeからローカルの8ビットコードページに変換される可能性が非常に高いです。元の変数は、その値のちょうど(近似値)を見ることはありません。

3

おそらくあなたがしたいですか?

printf("%s",getenv("PATH")); 

環境変数文字列を取得するメイクセンスを行います。
しかし、システムがあなたに文字列を与えるアドレスは、関連性がありません。
(特にこのプログラムの範囲外です)。

アドレスではなく、環境文字列の値に関心があります。
住所を使用する理由があれば、ここに記入してください。例えば

echo $PATH 

は、私にPATHとすべての私のプログラムの関心はその内容ではないアドレスの任意の並べ替えになり

/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin: ... etc 

を与えます。

+0

括弧が欠けて編集されました。 – ralphtheninja

関連する問題