ホームページ >バックエンド開発 >C++ >データを失わずにCの関数から配列を返す方法は?

データを失わずにCの関数から配列を返す方法は?

DDD
DDDオリジナル
2024-10-29 20:18:29364ブラウズ

 How to Return an Array from a Function in C   without Losing Data?

C の関数から配列を返す

C の関数から配列を返す場合、メモリ管理の複雑さを理解することが不可欠です。デフォルトでは、関数内のスタックに割り当てられたローカル配列は、関数が終了すると破棄されます。この動作により、関数の外部でこれらの配列にアクセスしようとすると、未定義の動作が発生します。

提供されたコードでは、配列 c が uni 関数内のスタックに作成されます。

<code class="c++">int c[10];</code>

この配列には関数内の値が正常に設定されていますが、関数が戻り、配列が破棄されると、値は失われます。この結果、予期しない出力が発生します。

この問題を解決するには、次の 2 つの代替アプローチを採用できます。

ポインターの使用:

変更割り当てられた配列へのポインタを返す uni 関数:

<code class="c++">int* uni(int *a,int *b)
{
    int* c = new int[10]; // Allocate array on heap
    int i = 0;
    // ...same code as before...
    return c;
}</code>

main では、ヒープに割り当てられたメモリの割り当てを解除する必要があります:

<code class="c++">int main()
{
    // ...same code as before...
    delete[] c; // Deallocate array from heap
    // ...
}</code>

使用a Struct:

別のアプローチでは、配列を構造体内でラップして構造体を返します。

<code class="c++">struct myArray {
    int array[10];
};

myArray uni(int *a,int *b)
{
    myArray c;
    int i = 0;
    // ...same code as before...
    return c;
}</code>

この場合、構造体は値によって返され、次のコピーが確保されます。配列はmain関数内で作成されます。構造体の値セマンティクスにより、構造体の戻り値を効率的にコピーできます。

以上がデータを失わずにCの関数から配列を返す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。