C で関数から配列を返す
C では、特に関数から配列を返すとエラーの原因となる可能性があります。配列はスタックに割り当てられます。
次のコードを考えてみましょう:
<code class="cpp">#include <iostream> using namespace std; int* uni(int *a, int *b) { int c[10]; int i = 0; while (a[i] != -1) { c[i] = a[i]; i++; } for (; i < 10; i++) c[i] = b[i - 5]; return c; } int main() { int a[10] = {1, 3, 3, 8, 4, -1, -1, -1, -1, -1}; int b[5] = {1, 3, 4, 3, 0}; int *c = uni(a, b); for (int i = 0; i < 10; i++) cout << c[i] << " "; cout << "\n"; return 0; }</code>
このコードでは、uni() 関数が配列 c を作成し、配列 a からの非負の数値をマージします。そして b を c にします。ただし、コードが c を返そうとすると、配列はスコープ外になり、ガベージ値が返されます。
この問題を回避するには、通常、配列を関数へのポインタとして渡し、そのポインタを返すことが推奨されます。 。ただし、ポインターの使用は面倒な場合があり、場合によっては、別のアプローチを使用する方が望ましい場合もあります。
もう 1 つの方法は、構造体またはクラスを使用して配列をカプセル化し、オブジェクトを値で返すことです。次の変更されたコードを考えてみましょう:
<code class="cpp">#include <iostream> using namespace std; struct myArray { int array[10]; }; myArray uni(int *a, int *b) { myArray c; int i = 0; while (a[i] != -1) { c.array[i] = a[i]; i++; } for (; i < 10; i++) c.array[i] = b[i - 5]; return c; } int main() { int a[10] = {1, 3, 3, 8, 4, -1, -1, -1, -1, -1}; int b[5] = {1, 3, 4, 3, 0}; myArray c = uni(a, b); for (int i = 0; i < 10; i++) cout << c.array[i] << " "; cout << "\n"; return 0; }</code>
この例では、uni() 関数は myArray 構造体のインスタンスを返します。構造体は値によって返され、その内部配列がコピーされるため、関数が戻った後でも値が有効であることが保証されます。
以上がC で関数から安全に配列を返すにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。