2

環境変数の名前を取得する C プログラムを作成し、そのメモリ アドレスを出力します。単純にgetenv() 関数を使用してジョブを実行します。PATHのアドレスの場所が欲しいとしましょう-> ./test PATH。しかし、gdb でそのプログラムをデバッグすると、その変数のメモリ位置が異なります。なぜこんなに違うのか、詳しく説明していただけますか?

より正確には:

./test PATH --> 0xbffffd96

gdb でデバッグ --> 0xbffffd53

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

./a.out--> PATH のアドレスは数字です

./b.out--> 別の番号

では、この 2 つの数値の違いの原因は何ですか? 聞きたいことが明確に示されていることを願っています。ありがとう仲間。

4

3 に答える 3

4

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

環境変数へのインターフェイスはそのような詳細を提供しないため、これはとにかく問題ではありません。たとえば、Windows では、環境変数を要求すると、Unicode からローカルの 8 ビット コードページに変換される可能性が非常に高くなります。元の変数は表示されず、その値 (の近似値) だけが表示されます。

于 2009-07-09T10:00:16.403 に答える
3

もしかしてやりたい?

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

環境変数文字列を取得することは理にかなっています。
ただし、システムが文字列を提供するアドレスは、どこにも関連性がありません
(特に、このプログラムの範囲外)。

アドレスではなく、環境文字列の値に注目する必要があります
アドレスを使用する理由がある場合は、ここに記入してください。

例えば、

echo $PATH

私に与える、

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

私のプログラム上の関心はすべて、PATHアドレスではなくその内容にあります。

于 2009-07-09T10:24:27.823 に答える
1

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

于 2009-07-09T09:15:32.783 に答える