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も見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
str系関数を使わずに二つの文字...
-
charでの計算?
-
c++ Base64でファイ...
-
ワイルドカードを用いた文字列検索
-
C言語 ミリ秒を日付に変換には
-
charからLPTSTRへの変換方法
-
fgetsなどのときのstdinのバッ...
-
C++のCreateFile関数で、ASCII...
-
Win32APIでのエディットボック...
-
構造体の各メンバにfor文からア...
-
C言語のfor文です。 繰り返しの...
-
C言語の入力した文字を反転させ...
-
atoi( ) の反対をやりたい
-
c言語配列の結合についてです。...
-
c言語の文字列の逆順のプログラ...
-
文字列ポインタを結合
-
プログラム
-
int main()の・・・
-
double型の値をchar配列に変換...
-
2曲同時再生するにはどうした...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
CStringをwchar_tに変換したい
-
str系関数を使わずに二つの文字...
-
c++ 文字列を入力して、一文字...
-
間接操作のレベルとは
-
int main()の・・・
-
C言語の入力した文字を反転させ...
-
atoi( ) の反対をやりたい
-
switch文で文字を比較すること...
-
double型の値をchar配列に変換...
-
テキストデータをそのままバイ...
-
Win32APIでのエディットボック...
-
干支のプログラム
-
コンパイルエラー invalid ope...
-
間接参照のレベルが異なっています
おすすめ情報