C の関数から配列を返す
C の関数から配列を返そうとすると、次のコードに示すように、予期しない動作が発生する可能性があります。スニペット:
<code class="cpp">int* uni(int *a,int *b) { int c[10]; ... return c; }</code>
この関数は、関数からローカル配列 c を返そうとします。ただし、関数が返されると、配列によって占有されていたメモリの割り当てが解除され、呼び出し元がアクセスしようとしたときに未定義の動作が発生します。
根本的な問題は、配列がスタックに格納される方法にあります。配列が関数内で宣言されると、配列はスタック、つまりローカル変数と関数呼び出しに使用されるメモリ領域に割り当てられます。関数が終了すると、配列のメモリを含むスタック上のメモリの割り当てが解除されます。
この問題を解決するには、いくつかの代替手段が存在します。
ポインタの受け渡し:
1 つのアプローチは、main 関数から配列へのポインターを渡すことです。
<code class="cpp">int* uni(int *a,int *b) { ... return a; }</code>
このアプローチにより、main 関数は配列に直接アクセスして操作できるようになります。ただし、セグメンテーション違反を回避するには、慎重なメモリ管理が必要です。
ベクトルまたは配列の使用:
プレーンな配列を使用する代わりに、std::vector のような C コンテナを利用することを検討してください。または std::array。これらのコンテナはメモリ管理を自動的に処理するため、手動でポインタを操作する必要がなくなります。
構造体を返す:
別のオプションは、配列を構造体内にラップして、 struct インスタンス:
<code class="cpp">struct myArray { int array[10]; }; myArray uni(int *a,int *b) { ... return c; }</code>
値 (構造体インスタンス) を返すことにより、配列の内容が main 関数のスコープにコピーされ、アクセス可能性が確保されます。
以上がC の関数から安全に配列を返すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。