C の関数から配列を返す
C の関数から配列を返そうとすると、次のコードに示すように、予期しない動作が発生する可能性があります。スニペット:
int* uni(int *a,int *b)
{
int c[10];
...
return c;
}
この関数は、関数からローカル配列 c を返そうとします。ただし、関数が返されると、配列によって占有されていたメモリの割り当てが解除され、呼び出し元がそれにアクセスしようとしたときに未定義の動作が発生します。
根本的な問題は、配列がスタックに格納される方法にあります。配列が関数内で宣言されると、配列はスタック、つまりローカル変数と関数呼び出しに使用されるメモリ領域に割り当てられます。関数が終了すると、配列のメモリを含むスタック上のメモリの割り当てが解除されます。
この問題を解決するには、いくつかの代替手段があります:
ポインタの受け渡し:
]1 つのアプローチは、メイン関数から配列へのポインターを渡すことです:
int* uni(int *a,int *b)
{
...
return a;
}
このアプローチにより、main 関数が配列に直接アクセスして操作できるようになります。ただし、セグメンテーション違反を回避するには、慎重なメモリ管理が必要です。
ベクトルまたは配列の使用:
プレーンな配列を使用する代わりに、std::vector のような C コンテナを利用することを検討してください。または std::array。これらのコンテナはメモリ管理を自動的に処理するため、手動でのポインタ操作の必要がなくなります。
構造体を返す:
別のオプションは、配列を構造体内にラップして、構造体インスタンス:
struct myArray
{
int array[10];
};
myArray uni(int *a,int *b)
{
...
return c;
}
値 (構造体インスタンス) を返すことにより、配列の内容が main 関数のスコープにコピーされ、アクセス可能性が確保されます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3