解析関数パラメータおよび戻り値
1474 ワード
ポインタを習ったばかりの人は、関数にポインタ変数を渡して、この関数の中でこのポインタに空間を申請して、値を割り当てますが、関数が終わった後もこのポインタは空のポインタで、その操作コンパイラに対してエラーを報告したり、わけのわからない値を与えたりします.これはランダム数です.
この関数が最終的に印刷された結果はランダム数です.これはなぜですか.
ここでは、関数呼び出しの場合について説明します.
関数が呼び出されると、システムはスタック領域に空間を動的に割り当てます.この空間の役割は、次のとおりです.
1.関数に入る前に環境変数と戻りアドレスを保存します.
2、関数に入る時に実パラメータのコピーを保存する.
3、関数内に局所変数を保存します.
ここで、関数を呼び出すとき、システムは関数に空間を動的に割り当て、実パラメータのコピーを行い、関数の「p」は主関数の「p」のコピーにすぎず、私たちが申請する空間、付与などの操作はこのコピーに対して行われていることがわかります.関数体が終わると、このコピーの生命も終わり、システムは関数に割り当てられた空間を回収し、このコピーを含む.これは、スペースの申請、値の付与などの操作が効果的ではないように見えます.
この問題を解決するにはいろいろな方法がありますが、ここではいくつか紹介します.
この問題は以下のように解決できます.
ここでは戻り値により,関数中の「p」のライフサイクルが延長され,最終的に我々が予想した効果を達成した.次はこれも完成できます.
#include <stdio.h>
#include <stdlib.h>
int my_fun(int *p)
{
p = (int *)malloc(sizeof(int));
*p = 101;
return 0;
}
int main(int argc, char **argv)
{
int *p;
my_fun(p);
printf(“%d
”,*p);
return 0;
}
この関数が最終的に印刷された結果はランダム数です.これはなぜですか.
ここでは、関数呼び出しの場合について説明します.
関数が呼び出されると、システムはスタック領域に空間を動的に割り当てます.この空間の役割は、次のとおりです.
1.関数に入る前に環境変数と戻りアドレスを保存します.
2、関数に入る時に実パラメータのコピーを保存する.
3、関数内に局所変数を保存します.
ここで、関数を呼び出すとき、システムは関数に空間を動的に割り当て、実パラメータのコピーを行い、関数の「p」は主関数の「p」のコピーにすぎず、私たちが申請する空間、付与などの操作はこのコピーに対して行われていることがわかります.関数体が終わると、このコピーの生命も終わり、システムは関数に割り当てられた空間を回収し、このコピーを含む.これは、スペースの申請、値の付与などの操作が効果的ではないように見えます.
この問題を解決するにはいろいろな方法がありますが、ここではいくつか紹介します.
この問題は以下のように解決できます.
#include <stdio.h>
#include <stdlib.h>
int *my_fun(int *p)
{
p = (int *)malloc(sizeof(int));
*p = 101;
return p;
}
int main(int argc, char **argv)
{
int *p;
p = my_fun(p);
printf(“%d
”,*p);
return 0;
}
ここでは戻り値により,関数中の「p」のライフサイクルが延長され,最終的に我々が予想した効果を達成した.次はこれも完成できます.
#include <stdio.h>
#include <stdlib.h>
int my_fun(int *p)
{
*p = 101;
return 0;
}
int main(int argc, char **argv)
{
int *p;
p = (int *)malloc(sizeof(int));
my_fun(p);
printf(“%d
”,*p);
return 0;
}