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.3
- 回答日時:
>argv[1] の内容を書き換えてバッファオーバーフロなどなどが起こったら
>何が起こるか分からないですし。
それを言うなら、すべての配列をconstにしなければならない。
この回答への補足
バッファオーバーフローに言及したのは私のミスです。話が発散してしまいますから。取り合えず、オーバーフローしない場合でも、パラメータを書き換えるメリットがあるのか?を知りたいです。また、デメリットもあり得るから疑問だったし。
プログラム名やパラメータがメモリ内のどこに収容されているかは、OSなどに依存するでしょうから、下手に書き換えると動作がおかしくなる可能性があるような気がしまして。また、argvを書き換えるプログラムを書いたとき、後になって、やはり、元のパラメータが何だったか知りたくなると、プログラムの書き換えが大変だし
ご指摘ありがとうございました。
>それを言うなら、すべての配列をconstにしなければならない。
あるいは、書き換え可能文字列の配列を作るときに、strncpyなどなどを使えるように、文字列幅の情報が得られるようにする、などもありますが、argvでは使えなさそうですね。
バッファオーバーランなどの問題に関しては、自力で調べてみて、どうしても分からなければ、別質問とさせていただきます。
No.2
- 回答日時:
変数は変数であって、定数には成れない
男の子が女の子になれないのと一緒
今の世の中、稀に例外もあるので喩えとして少し弱いが・・・・
この回答への補足
#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 が付いていれば、コンパイルエラーになるのでエラーが分かりやすいです。
No.1
- 回答日時:
規格(JIS X3010:2003)上、
int main(void)
int main(int argc, char * argv[])
のどちらかを使うとなっているからです。
勝手に規約を無視しちゃいかんでしょ。
この回答への補足
いや、何故、規格で constが入っていないのか? が疑問なのですが。
歴史的事情なのか(初期のCにはconstがなかったし)? argc>2で argv[1] の内容を書き換えてバッファオーバーフロなどなどが起こったら何が起こるか分からないですし。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
charでの計算?
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
double型の値をchar配列に変換...
-
c言語でユーザ関数を利用して入...
-
テキストデータをそのままバイ...
-
C言語について。
-
CStringをwchar_tに変換したい
-
enumの記述について。
-
アルファベットの並べ替え
-
'const char *' 型は 'char *' ...
-
3桁区切(コンマ)記号をつけ...
-
C言語のポインターで詰まっている
-
switch文で文字を比較すること...
-
pingの結果を取得する方法
-
配列をnビットシフトする
-
for文 アスタリスクで形を作る
-
ncursesで...
-
C言語の入力した文字を反転させ...
-
Visual Studio strcpyについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
テキストデータをそのままバイ...
-
charでの計算?
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
atoi( ) の反対をやりたい
-
2曲同時再生するにはどうした...
-
C言語の入力した文字を反転させ...
-
配列をnビットシフトする
-
3桁区切(コンマ)記号をつけ...
-
int main()の・・・
-
型変換
-
CStringをwchar_tに変換したい
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
double型の値をchar配列に変換...
-
絶対パスからのファイル名の切...
-
switch文で文字を比較すること...
-
c++ 文字列を入力して、一文字...
おすすめ情報