1

配列を返す関数が必要ですが、ほとんどの検索例が示すように、引数として配列を取りません。

コードは次のようになります。

double  myfunction ()
{
    double arr[10];
    //assign values to the array
    return arr;
}

main()
{
    double arr2[10];
    arr2[10] = myfunction;
    //print arr2
}

ポインタを使用して配列を表示すると、「CCCCCC」のような値が得られました...

4

2 に答える 2

6

それはできません...配列はメモリのブロックであるため、「返す」ことはできません...関数呼び出しを介して配列にポインタを渡すことはできますが、を指しているポインタを安全に返すことはできませんそれらの配列が宣言されていない限り、配列メモリブロックstatic。そうしないと、関数が戻ったときに配列が占有しているスタック上のメモリが再利用され、スタックメモリの場所への返されたポインタが無効になるため、未定義の結果が得られます。返されたポインタを使用すると、スタックが破損したり、プログラムがクラッシュしたりする可能性があります。

Cでは、この問題を回避するためにヒープに割り当てられた配列へのポインターを明示的に使用する必要がありますが、C ++では、std::vectorまたはstd::array固定サイズの配列を使用するのが最適です。たとえば、std::vector(スタックではなく)アレイを格納するためにヒープメモリを使用しますが、RAIIを介して、ヒープメモリはオブジェクトの存続期間によって安全に管理されます。したがって、Cとは異なり、ヒープメモリを指している関数から返されたポインタが指すメモリの解放に失敗することによるメモリリークについて心配する必要はありません。

于 2012-05-30T01:23:04.797 に答える
1

注: C および C++ 標準の両方で、結果の型がmain 必要です。int

また、const可能な限りどこでも使用することをお勧めします。これにより、コードに制約が追加され、コードが理解しやすくなります (考慮する必要が少なくなります)。

そして最後に、最も重要なことは、標準ライブラリ機能を使用することです。

#include <array>
using namespace std;

typedef array<double, 10> MyArray;

MyArray myfunction ()
{
    MyArray arr;
    //assign values to the array
    return arr;
}

int main()
{
    MyArray const arr = myfunction();
    //print arr2
}
于 2012-05-30T01:49:13.400 に答える