はじめまして
mainの引数についてわからないことがあります。
下記のコードをみかけたことがあるのですが、
第一、第二まではわかります。
第三番目の引数の意味がわかりません。
どういう意味でしょうか?
main( int argc, char *argv[], char *envp[] )
確か、環境変数だったような。
曖昧な記憶なんで間違ってたら、どなたかつっこんでください。
環境変数が
AAA=BBB
CCC=DDD
ってあった場合 envp から見える領域には
envp[ 0] = 'A'
envp[ 1] = 'A'
envp[ 2] = 'A'
envp[ 3] = '='
envp[ 4] = 'B'
envp[ 5] = 'B'
envp[ 6] = 'B'
envp[ 7] = '\0'
envp[ 8] = 'C'
envp[ 9] = 'C'
envp[10] = 'C'
envp[11] = '='
envp[12] = 'D'
envp[13] = 'D'
envp[14] = 'D'
envp[15] = '\0'
envp[16] = '\0'
って感じで最後に文字列の終端を示す '\0' が二つ続いたような気がします。
VC++だと,環境変数文字列の配列です。
ただし,これはコンパイラ依存なので,stdlib.hのgetenvを使う方が望ましいです。
#列挙するようなことをしたい場合はしょうがないですが。
なお,データはargvと同じように保持されています。
つまり,
envp[0] : 文字列へのポインタ
envp[1] : 文字列へのポインタ
……
envp[n] : NULL
です。
#nは調べてみないとわからない。
すいません、まちがってました。
大変失礼いたしました。
ありがとうございます。
環境変数だということはわかりました。
環境はvc++です。
ただ、どういう仕組みでどの環境変数が取得されてきているのか
わかりません。vc++に設定があるのでしょうか?
よろしければ、ご教授ください。
こんなコードを書いてみれば一目瞭然。
#include <stdio.h>
int main (int argc, char *argv[], char *envp[])
{
char **ptr;
for (ptr = envp; *ptr; ++ptr) puts(*ptr);
return 0;
}
なんか環境変数の意味がわかっていないような気がします。
環境変数というのはOSがメモリ内に保持している物で
代表的なものにPATHがあります。
この辺の設定はOS側に設定があるのでそこも参考にしましょう。
>ただ、どういう仕組みでどの環境変数が取得されてきているのか
>わかりません。vc++に設定があるのでしょうか?
どういう仕組みでと言う意味がわからないのですが、
それは引き渡される内容がどうやって取り出されているかと言う意味なんでしょうか?
VC++側の設定というのは、プロジェクトの設定のことを言っているのですか?
上のコードを実行してみました。
環境変数がすべてでてきました。
しかし不思議なことがあります。
ptrには次々に環境変数が入っているのですが、
envpの中をウォッチしてみるといつも同じ環境変数が入っているようです。
なぜ?
envpは、charのポインタの配列ですが、この配列は何個あるかわかりませんよね。
実際には、char** envpと考えた方が良いかもしれないです。
デバッガもこの場合、何個あるかわからない配列を全て出すわけには行きませんから
先頭の物しか出しません。
だから、デバッガのWatchでは確認できないのです。
ありがとうございました。
丁寧なご説明でよくわかりました。