C で関数から安全に配列を返すにはどうすればよいでしょうか?

Linda Hamilton
リリース: 2024-10-30 08:16:02
オリジナル
168 人が閲覧しました

How do you safely return an array from a function in C  ?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!