0

配列を返すことに関する C++ の構文に関する質問があります。配列を渡すと、次のようにできます。

void merge_sort(int input_array[], int size);//notice the first parameter

私はこれが機能することを知っています:

int* merge_sort(int input_array[], int size){
    //do something with input_array
    return new int[2]; //dummy array
}

質問:

int[] merge_sort(int input_array[], int size){ //Question is on return type, wont compile
     //do something with input_array
    return new int[2]; //dummy array
}

return int* 成功。int [] を返すのに失敗するのはなぜですか?

4

3 に答える 3

2

C と C++ の両方で、関数の引数として配列を渡すことも、関数の結果として配列を返すこともできません。

はい、この構文では、配列引数を渡しているように見える場合があります。

void func(int param[]) {
    // ...
}

...

int arr[10];
func(arr);

しかし実際には、配列の最初の要素へのポインターを渡しているだけです。パラメータ定義int param[]調整されます。とまったく同じint *paramです。また、配列型の式は、ほとんどのコンテキストで、最初の要素のポインターに暗黙的に変換されます。

そのため、サイズを別の引数として渡す必要があります。

C の機能のみを使用して、配列を返すようなことを行う方法がいくつかあります。

  • static関数は、配列の最初の要素へのポインターを返すことができます。これにはいくつかの欠点があります。サイズを固定する必要があり、複数の呼び出し元が同じオブジェクトへのポインターを取得します。
  • 関数は、呼び出し元から渡された配列の最初の要素へのポインターを受け取ることができます。これにより、呼び出し元に配列の割り当てと割り当て解除の負担がかかります。
  • malloc()関数は、動的に割り当てられた ( C ではnew、C++ では) 配列の最初の要素へのポインターを返すことができます。これには、呼び出し元が配列の割り当てを解除する必要があります。

C++ には、これらすべてを処理できるライブラリ クラスの豊富なセットが用意されています。

推奨される読み物: comp.lang.c FAQのセクション 6 。

構造体を引数として渡し、それらを関数の結果として返すことができます。また、構造体にはメンバーとして配列を含めることができますしかし、それはあなたが思っているほど役に立ちません。構造体のメンバーである配列は固定サイズでなければなりません。配列を操作する最も有用なコードは、動的サイズを処理できます。

于 2013-02-09T22:25:59.910 に答える
1

そもそもなんで返品したいの?

配列は実際には関数に「渡される」のではなく (要素のコピーは作成されません)、先頭へのポインターのみが渡されます。関数が配列要素を再配置すると、の配列で再配置されます。関数が終了した後、呼び出し元のコードは単純に古い (現在は並べ替えられた) 配列を使用し続けることができます。

つまり、関数は副作用を生成します。

私はこれが機能することを知っています:

int* merge_sort(int input_array[], int size){
    //do something with input_array
    return new int[2]; //dummy array
}

(実際に戻る必要があると仮定します...)

それは「動作」しますが、非常に危険です。呼び出し元は、返された配列を解放delete[]する必要があることを認識する必要があります (そうしないと、メモリ リークが発生します) delete。戻り値の型 (単なるポインター)。input_array呼び出し元は、 が関数内で解放されているかどうかについても疑問を持っている可能性があります。

そのすべてを文書化したとしても、発信者が間違いを犯すのは非常に簡単です。代わりに、最新の C++ が提供する機能を使用する方がはるかに優れています。たとえば、std::vector.

于 2013-02-09T22:07:11.930 に答える
0

このアプローチではベクトルを使用する必要があります。プロジェクトに含めてから、配列の場合とほぼ同じようにベクトルを使用します。

ここでベクトルを見ることができます:http://msdn.microsoft.com/en-us/library/vstudio/9xd04bzs.aspx

ベクターの優れた点は、プロジェクトに合わせて動的にスケーリングされ、バッファー オーバーフローによるメモリ リークなどを引き起こさないことです。これは ArrayList によく似ています。

于 2013-02-10T00:59:31.847 に答える