配列の受け渡し: 潜在的な落とし穴
C の関数から配列を返すことは単純そうに見えますが、ユーザーの経験からわかるように、隠れた複雑さが生じる可能性があります。関数を使用して 2 つの配列から非負の数値をマージしようとしています。
ユーザーは、マージされた配列を作成した関数の外でその配列にアクセスすると、不正な出力が観察されました。これは、関数内で "int c[10]" として宣言された配列など、スタック上に作成された配列は、関数が終了すると破棄されるためです。その後これらにアクセスすると、未定義の動作が発生します。
これに対処するには、ローカル配列をその配列を含む構造体に置き換えるオプションが 1 つあります。構造体が返されると、その内部配列が呼び出し側関数のメモリにコピーされ、スタック破壊の問題が効果的に回避されます。以下に例を示します。
<code class="cpp">struct myArray { int array[10]; }; myArray uni(int *a, int *b) { myArray c; // Same logic as before for merging arrays return c; }</code>
main では、返された構造体を割り当てて内部配列にアクセスできます。
<code class="cpp">myArray c = uni(a, b); for (int i = 0; i < 10; i++) { cout << c.array[i] << " "; }</code>
別の解決策は、ポインターを使用して配列にメモリを割り当てることです。 「ポインタの受け渡し」の章で説明したように、動的に。ただし、これにより、メモリを手動で管理し、メモリ リークを回避する必要が生じます。
アプローチの選択は特定の要件によって異なりますが、関数で配列を使用する場合は、これらの落とし穴を理解することが重要です。
以上がC の関数から戻った後、マージされた配列が消えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。