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 サイトの他の関連記事を参照してください。