mainの引数 – プログラミング – Home

通知
すべてクリア

[解決済] mainの引数


とら
 とら
(@とら)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

はじめまして
mainの引数についてわからないことがあります。
下記のコードをみかけたことがあるのですが、
第一、第二まではわかります。
第三番目の引数の意味がわかりません。
どういう意味でしょうか?

main( int argc, char *argv[], char *envp[] )


引用未解決
トピックタグ
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 81
 

確か、環境変数だったような。
曖昧な記憶なんで間違ってたら、どなたかつっこんでください。

環境変数が

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' が二つ続いたような気がします。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

VC++だと,環境変数文字列の配列です。
ただし,これはコンパイラ依存なので,stdlib.hのgetenvを使う方が望ましいです。
#列挙するようなことをしたい場合はしょうがないですが。

なお,データはargvと同じように保持されています。
つまり,
envp[0] : 文字列へのポインタ
envp[1] : 文字列へのポインタ
……
envp[n] : NULL
です。
#nは調べてみないとわからない。


返信引用
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 81
 

すいません、まちがってました。
大変失礼いたしました。


返信引用
とら
 とら
(@とら)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

ありがとうございます。
環境変数だということはわかりました。
環境はvc++です。
ただ、どういう仕組みでどの環境変数が取得されてきているのか
わかりません。vc++に設定があるのでしょうか?
よろしければ、ご教授ください。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

こんなコードを書いてみれば一目瞭然。
#include <stdio.h>

int main (int argc, char *argv[], char *envp[])
{
char **ptr;
for (ptr = envp; *ptr; ++ptr) puts(*ptr);

return 0;
}


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

なんか環境変数の意味がわかっていないような気がします。
環境変数というのはOSがメモリ内に保持している物で
代表的なものにPATHがあります。
この辺の設定はOS側に設定があるのでそこも参考にしましょう。

>ただ、どういう仕組みでどの環境変数が取得されてきているのか
>わかりません。vc++に設定があるのでしょうか?

どういう仕組みでと言う意味がわからないのですが、
それは引き渡される内容がどうやって取り出されているかと言う意味なんでしょうか?

VC++側の設定というのは、プロジェクトの設定のことを言っているのですか?


返信引用
とら
 とら
(@とら)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

上のコードを実行してみました。
環境変数がすべてでてきました。
しかし不思議なことがあります。
ptrには次々に環境変数が入っているのですが、
envpの中をウォッチしてみるといつも同じ環境変数が入っているようです。
なぜ?


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

envpは、charのポインタの配列ですが、この配列は何個あるかわかりませんよね。
実際には、char** envpと考えた方が良いかもしれないです。
デバッガもこの場合、何個あるかわからない配列を全て出すわけには行きませんから
先頭の物しか出しません。
だから、デバッガのWatchでは確認できないのです。


返信引用
とら
 とら
(@とら)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

ありがとうございました。
丁寧なご説明でよくわかりました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました