« ブートレグ | トップページ | Steps Ahead / Steps Ahead »

2004.02.24

argv[argc]は使っても良いか?

久々にC言語でコマンドラインツールを作成しました。コマンドラインツールの場合、引数でオプションなどを指定することが多いですね。C言語の場合、
int main(int argc, char **argv);
のargcとargvで引数を受け取ることになります。argcが引数の数、argvが引数の文字列です。だいたいの場合次のようなデータが入ります。

argv[0]=コマンド名
argv[1]=第1パラメータ
argv[2]=第2パラメータ
:
argv[argc-1]=第argc-1パラメータ

さて問題です。argv[argc]はなんでしょう?

この点について記述しているページをGoogleで検索してみると、
http://www.wakhok.ac.jp/~kanayama/C/02/node186.html

http://www.sist.ac.jp/~suganuma/learn/2-bu/7-sho/7-4/7-4.htm
がありました。
この両者はargv[argc]についての記述が異なります。
一般的な配列 a[n]の場合、a[n-1]までがデータとして有効で、a[n]は番兵と&a[n]は参照できるもののa[n]自体へのアクセスはご法度です。これと同じと考えるなら、argv[argv]の内容は不定です。

では答え。ISO Cの規格書より、

argv[argc] shall be a null pointer.

というわけでargv[argc] はNULLでした。よって

while ( *++argv) {
/* .... */
}

というコードも安心して書けます。

« ブートレグ | トップページ | Steps Ahead / Steps Ahead »

コメント

ども、おひさしぶり。いつも楽しく読んでます。
argv[argc]の件、へぇー、と思って技術英語に詳しい人に聞いてみました。
その人によると、
「argv[argc] が null pointer であれば安全(ほぼ正しい)です」
と言ったニュアンスだそうで、コンパイラの実装に依存するのではないかと思います。
may/might/will/shallは(未来形以外は)書き手が「断定できなくてちょっと困っている」って感じだそうで。
ただし「shallは最近は一般的には使われないのでちょっと自信がない」とも言ってました(笑)。

高瀬さん、読んでいただいてありがとうございます。
shallの件ですが、規格書や契約書などに良く出て来ます。で、この場合「そうしなければならない」という強い意味を持っています。ですので規格上はargv[argc]は「NULLでなければならない」のです。もちろん実装依存ですので本当にNULLかどうかはわかりません。
今回使用したGCCはNULLでした。

またまた、へぇーっです。ためになるなー。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/7658/1385303

この記事へのトラックバック一覧です: argv[argc]は使っても良いか?:

« ブートレグ | トップページ | Steps Ahead / Steps Ahead »

最近のトラックバック

無料ブログはココログ