2016-07-05 22 views
1

私は "NS2 Simulator"を使ってコンピュータネットワークをシミュレートすることに取り組んでいます。 char *の代わりにconst char* const* argvを使用する理由がわかりません。なぜ "char *"の代わりに "const char * const * argv"を使用するのですか?

代わりにchar *を使用できますか?この件について多くのQAがありますが、私はそれについて混乱しました。この質問を「重複」としないでください。 なぜ我々はconst char* const* argvを以下の関数で使用しますか?これはC++標準のルールですか?その代わりにstringまたはchar **のいずれかを使用できますか?私たちが代わりに "のchar *" の "ARGV ... CONST" を使用すべき理由

Function Connector::command. 
    //~ns/common/connector.cc 
    int Connector::command(int argc, const char*const* argv) 
    { 
    Tcl& tcl = Tcl::instance(); 
    ... 
    if (argc == 3) { 
    if (strcmp(argv[1], "target") == 0) { 
    ... 
    target_ = (NsObject*)TclObject::lookup(argv[2]); 
    ... 
    } 
    ... 
    } 
    return (NsObject::command(argc, argv)); 
    } 
+1

'argv'が' main'の典型的な引数であると仮定すると 'char *'ではなく 'const char * const *'ではなく 'char **'でなければなりません。 – Cornstalks

+0

そして、もしあなたが 'const char * const * argv'のこの"モンスター "が何を意味しているのかを知りたければ、[this](http://c-faq.com/decl/spiral.anderson.html) 。前述のように、標準Cでは、 'main'の2番目の引数は' char ** '型でなければなりません。 – vsoftco

+0

@Cornstalksまたは 'char * argv []'も動作し、OPのためにこれをポストするだけです。 –

答えて

0

「const」はプログラマからのもので、書き込むコードがargvを変更しようとしたときにコンパイラに知らせるように指示します。

代わりにchar *を使用できますか?

おそらく、時には問題ではありません。しかし、あなたが誤ってargvを変更した場合(あるいはconstの名前が何であれ)、コンパイラはあなたが間違いをしたことを知らせません。その結果はあなたが望んでいないもの、たとえUBです。

+0

UBのシナリオを共有できますか? – CinCout

0

プログラマは、const修飾がの引数にどのように適合するかを許可されています。この署名の利点は:

void func(const char* const* argv); 

...それは任意const修飾と、(main()又はexec()に渡されたタイプの)引数の配列を受け入れることです。

だから、これらすべてが許容されている:

int main(int, char** argv) 
{ 
    func(argv); 
} 

int main(int, const char** argv) 
{ 
    func(argv); 
} 

int main(int, char* const* argv) 
{ 
    func(argv); 
} 

int main(int, const char* const* argv) 
{ 
    func(argv); 
} 

ですから、引数配列パラメータ(あなたの関数は変更しないこと)を選択するためにそのおそらく最高の署名を受け入れるように機能を書いている場合。

2

const char*const* argvは、"定数charへの定数ポインタへのポインタ"を意味します。 char *と同じではありません。 argvポインタは再割り当てされないので、const修飾子には理由があります。要素には添字でアクセスする必要があります。

これにより、呼び出し側がargvを動的に割り当て、command()に渡して後で解放することができます。そうでない場合、ポインタが解放される前にポインタを他の場所にポイントすると、それまで指し示していたメモリがリークしてしまいます。

const char* const* argvは、2レベルの間接を作成します。最初のレベルはconst pointer to a const charで、2番目のレベルはconstポインタへのポインタです。

関連する問題