16

私は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"};

最初のいくつかが機能しなかったのはなぜで、最後のものが機能したのはなぜですか?

前もって感謝します。

4

4 に答える 4

10

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

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"};

上記のコードでは、変数の正しい型achar* a[]. 繰り返しますが、配列とポインター (型に関するもの) は非常に異なるものです。char配列は (終了した場合) ポインターに減衰する可能性がありますNULL が、明示的なキャストを除いて、残りの部分については、ポインターと配列を使用することはできません。

前に述べたように、char* []C 文字列の配列の正しい型であるため、最後のものは機能しました。

とにかく、宿題をするだけなら、このことを学べば大丈夫です。C-ただし、C++ を使用した将来の開発では、C 文字列、C 配列などので始まる「機能」を使用しないようにしてください。C++ の標準ライブラリはstd::stringstd::arraystd::vectorなどを無料で提供します。

本当に動的メモリを割り当てる必要がある場合は( newand delete、 またはnew[]およびを使用)、またはなどのスマート ポインターdelete[]を使用してください。std::shared_ptrstd::unique_ptr

于 2013-09-18T10:30:52.400 に答える
7

あなたは C++ で作業していると言います。次に、簡単に無視const char*してchar**、使用できるものに集中できます。

#include <string>
#include <vector>

std::vector<std::string> arrayOfStrings;
arrayOfStrings.push_back("foo");

bool func(const std::vector<std::string>>& a) {
  ..
}

コンパイル時にサイズがわかっている場合は、次を使用することもできますstd::array

std::array<255, std::string> fixedArrayOfStrings

編集:どのような場合でもC文字列の配列を構築する必要があるため、ベクトルから簡単に作成できます:

const char **arrayOfCstrings = new const char*[vector.size()];

for (int i = 0; i < vector.size(); ++i)
  arrayOfCstrings[i] = vector[i].c_str();

func(arrayOfCstrings);

delete [] arrayOfCstrings;
于 2013-09-18T10:06:16.670 に答える