1. ホーム
  2. c++

[解決済み] char**の初期化

2022-03-05 09:38:45

質問

私はC++の超初心者です。char**を取り込む関数を呼び出そうとしています。

bool func(char** a) {
    //blablabla
}

つまり、c-stringの配列を取り込んでいるわけです。char**を作成する必要があるのですが、何も動作しません。

char** a = char[255][255]; // error: type name is not allowed

char** a = new char[255][255]; // error: a value of type "char (*)[255]" cannot be used to initialize an entity of type "char **"

char a[][] = {"banana", "apple"};
char** b = &a; // error: a value of type "<error-type> (*)[2]" cannot be used to initialize an entity of type "char **"

最後に必要なのは

char* a[] = {"banana", "apple"};

なぜ、最初の数本はうまくいかず、最後の1本はうまくいったのか?

よろしくお願いします。

どのように解決するのですか?

あなたのコードには多くの間違いがあります。

char** a = char[255][255]; // error: type name is not allowed

まず第一にこれは有効なC++(あるいはC)ですらありません。たぶん、あなたはこう言いたかったのでしょう。

char a[255][255];

いずれにせよ,動的に割り当てられる2次元配列の型は,以下のようなものではないことを常に念頭に置いてください. ** しかし (*)[N] というのは、かなり違いますね。

char** a = new char[255][255]; // error: a value of type "char (*)[255]" cannot be used to initialize an entity of type "char **"

コメントにあるエラーメッセージは、私が先ほど言ったことをそのまま説明しています。

char a[][] = {"banana", "apple"};

上記のコードでは、変数の正しい型は a は、次のようになります。 char* a[] . 繰り返しますが、配列とポインタは(型が関係しているため)非常に異なるものです。A char 配列はポインタに崩壊する可能性があります(もし NULL  しかし、それ以外では、明示的なキャストを除いて、ポインタと配列の使い分けはできません。

最後のは、さっき言ったように、うまくいったから。 char* [] は、C文字列の配列として正しい型です。

いずれにせよ、宿題にするくらいなら、こんなこと覚えてもいいんじゃないでしょうか。でも、今後C++を使った開発をするときは、なるべく C- C-string、C-arrayなどのような。C++の標準ライブラリでは std::string , std::array , std::vector といった 無償で .

もし、あなたが 本当に で)ダイナミックメモリを割り当てる必要があります。 newdelete または new[]delete[] を使用してください。 スマートポインタ のように std::shared_ptr または std::unique_ptr .