解析関数パラメータおよび戻り値

1474 ワード

ポインタを習ったばかりの人は、関数にポインタ変数を渡して、この関数の中でこのポインタに空間を申請して、値を割り当てますが、関数が終わった後もこのポインタは空のポインタで、その操作コンパイラに対してエラーを報告したり、わけのわからない値を与えたりします.これはランダム数です.
#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; }