• ベストアンサー

main の引数には const 付けた方が

C言語での質問です。 引数を取るような main 関数は int main( int argc, char *argv[]){~} とされていますが、argvの指す文字列を変更する、というのはいくら何でもまずいので、 int main( int argc, const char *argv[]){~} あるいは int main( int argc, const char const * const * argv){~} の方がいいのではないでしょうか? 何故、constを付けない形が出回っているのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

> できれば、どういう場合に変更することに意味があるのか詳しく知りたいです。 昔、プログラムで使えるメモリが貴重だった頃は、どうやってメモリを節約するかが 重要でした。そういう世界では、入力パラメータを解析するのにメモリを消費しないで 解析するのがよいコーディングでした。 カンマ区切りのパラメータを解析する時は、strtok()を使って 入力パラメータ(argv)を分解する(区切り文字を\0で書き換えてパラメータを取り出す) というのが普通の方法でした。 strtokのマニュアルでも、サンプルソースにargvで入力されたパラメータを strtokで分解する例が書かれています。 http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/strtok.3.html 今でも組み込み系でメモリがあまり使えないところでは、こういう手法は よく使われると思います。 パラメータを分解するのに、わざわざ新しいメモリ領域を確保して別の領域に 取り出すなんて、(環境によっては)メモリの無駄遣いということです。 このために、C言語の規格でargc,argvは書き換え可能でなければならない ことが明記されています。

mikamikadon
質問者

お礼

詳しい説明、ありがとうございました。 argvを変更する重要な場面がよく分かりました。 どちらにしろ、argvの書き換えは慎重にやらなければいけないでしょうが。 「この場合はどうなるんだろう?」「あの場合は?」などの考えが出てきていますが、それらが自己解決できなかったときは別質問とさせていただきます。

mikamikadon
質問者

補足

あ、なるほど! >昔、プログラムで使えるメモリが貴重だった頃は、どうやってメモリを節約するかが 重要でした。 これは分かるので、そういう歴史的理由かもなどとも思いましたが、組み込み系だとメモリは今でも重要ですね。(組み込み系のプログラムは作ったことがないのでうっかりしていました。) かなり納得したので、質問締め切ることも考えましたが、「ちょっと待った!」という回答が来るかもしれないので、もう少し締め切りはのばしておきます。

その他の回答 (12)

  • trajaa
  • ベストアンサー率22% (2662/11921)
回答No.2

変数は変数であって、定数には成れない 男の子が女の子になれないのと一緒 今の世の中、稀に例外もあるので喩えとして少し弱いが・・・・

mikamikadon
質問者

お礼

どうもありがとうございます。 argvの仕様が、変更可能だったのですね。

mikamikadon
質問者

補足

#include <stdlib.h> 質問の仕方がまずかったです。規格ではなぜconstではないか?が疑問だったのです。argvの値は関数名やパラメータですから、これを変更可能にする意味があるのか?ということです。 あざとい例ですが。 #include <stdlib.h> int main( int argc, char *argv[] ){ char *av[3]={NULL, "abc", "def"}; if( argc>1 ){ argv[1][0] = 'X'; return EXIT_SUCCESS; } main( 3, av ); return EXIT_SUCCESS; } これだと、コンパイルは警告なしで通ります。しかし、実行時にアクセス違反で異常終了します(処理系によりますが)。argv に const が付いていれば、コンパイルエラーになるのでエラーが分かりやすいです。

  • ok-kaneto
  • ベストアンサー率39% (1798/4531)
回答No.1

規格(JIS X3010:2003)上、 int main(void) int main(int argc, char * argv[]) のどちらかを使うとなっているからです。 勝手に規約を無視しちゃいかんでしょ。

mikamikadon
質問者

お礼

どうも、ありがとうございました。 他の方のご回答もあって、何故そういう規格になっているのか分かりました。

mikamikadon
質問者

補足

いや、何故、規格で constが入っていないのか? が疑問なのですが。 歴史的事情なのか(初期のCにはconstがなかったし)? argc>2で argv[1] の内容を書き換えてバッファオーバーフロなどなどが起こったら何が起こるか分からないですし。

関連するQ&A