C/C++関数が配列を返す方法
8519 ワード
C/C++で関数が配列を返したいという問題は、ある関数内で処理された結果データが別の関数に引き継がれる必要がある場合など、関数間の相互通信を解決するために、アプリケーションシーンでは3つの方法があることが多い(例えば、関数funcでa[]配列を割り当て、その後、その配列を他の操作することができる)
1.グローバル変数を使用してデータを直接操作します.
このような方法は関数間の通信やパッケージングの考え方を破っているので,使用を推奨しない.
2.ヒープ領域を動的に開いてメモリを解決する.
この方法は間違っていて、C/C++の関数の局所変数が、関数が終了すると自動的に削除されることを知っているので、関数は関数内の局所変数のアドレスを返すことができません.これは変数のライフサイクルに関係しているので、malloc関数でメモリを動的に開き、freeで解放することができます.
動的にメモリをヒープ領域に開き、手動で開き、手動で解放することで、変数のライフサイクルの問題を完全に回避できます.
3.呼び出し元からの配列ポインタ
関数に配列は返されませんが、配列通信の問題を解決することもできます.主な考え方は、呼び出し元で配列を定義し、アドレスを入力することです.
がんばって~~~
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;
}
関数に配列は返されませんが、配列通信の問題を解決することもできます.主な考え方は、呼び出し元で配列を定義し、アドレスを入力することです.
がんばって~~~