C/C++関数が配列を返す方法

8519 ワード

C/C++で関数が配列を返したいという問題は、ある関数内で処理された結果データが別の関数に引き継がれる必要がある場合など、関数間の相互通信を解決するために、アプリケーションシーンでは3つの方法があることが多い(例えば、関数funcでa[]配列を割り当て、その後、その配列を他の操作することができる)
1.グローバル変数を使用してデータを直接操作します.
int a[2];
void func(void)
{
    a[0] = 1;
    a[1] = 2;
}

int main()
{
    func();
    ....
}

このような方法は関数間の通信やパッケージングの考え方を破っているので,使用を推奨しない.
2.ヒープ領域を動的に開いてメモリを解決する.
int *func(void)
{
    int a[2];
    a[0] = 1;
    a[1] = 2;
    return a;
}

int main()
{
    int *p;
    p = func();
    ....
    return 0;
}

この方法は間違っていて、C/C++の関数の局所変数が、関数が終了すると自動的に削除されることを知っているので、関数は関数内の局所変数のアドレスを返すことができません.これは変数のライフサイクルに関係しているので、malloc関数でメモリを動的に開き、freeで解放することができます.
int *func(void)
{
    int *a;
    a = (int*)malloc(sizeof(int)*2);
    a[0] = 1;
    a[1] = 2;
    return a;
}

int main()
{
    int *p;
    p = func();
    ....
    free(a);
    return 0;
}

動的にメモリをヒープ領域に開き、手動で開き、手動で解放することで、変数のライフサイクルの問題を完全に回避できます.
3.呼び出し元からの配列ポインタ
void func(int *a)
{
    a[0] = 1;
    a[1] = 2;
    return a;
}

int main()
{
    int a[2];
    func(a);
    ....
    return 0;
}

関数に配列は返されませんが、配列通信の問題を解決することもできます.主な考え方は、呼び出し元で配列を定義し、アドレスを入力することです.
がんばって~~~