C言語関数の戻り値の実現方法と誤り
1074 ワード
例:この3つの関数は正常に戻ると思いますか.
func 1とfunc 2は必ず戻ることができて、func 3は戻ることができなくて、どうしてですか?
まず,関数戻り値の原理func 1の実現フローを理解し,main関数変数x,yを関数func 1のスタック上のa,bにコピーする.このとき、局所変数cを定義し、a+bの値をcに割り当て、return cの場合、局所変数cの値をシステムが自動的に生成し管理する一時変数c`に割り当て、局所変数cの値を破棄し、rec=func 1(x,y);の場合、rec=一時変数c`の値になります.だから正常に戻ることができます.
では、同じ理屈でfunc 2とfunc 3を比較すると、どんな違いがありますか?
違いはchar*str=「abs」です.「abs」文字列はプログラムの定数記憶領域に保存され、strはこの変数を指し、関数が戻るとstrTmpの一時変数には「abs」のアドレスが保存され、「abs」のアドレスには定数記憶領域があるので正常に戻ることができます.
char str[]=「qwe」;「qwe」は定数記憶領域に格納されているがstrは1つのコピーであるため、関数が戻るとこのコピーの内容は破棄され、returnのbufの一時変数はこのコピーのアドレスであり、中身はすでに乾いているので正常に戻ることはできない.
int func1(int a , int b)
{
int c = 0;
c = a + b;
return c;
}
char * func2()
{
char *strTmp = "abs";
return strTmp;
}
char *func3()
{
char buf[] = "qwe";
return buf;
}
int main()
{
int rec = 0;
int x = 1;
int y = 2;
rec = func1( x , y );
printf("rec = %d
" , rec);
char *str;
str = func2();
printf("%s
" , str);
str = func3();
printf("str = %s
" , str);
return 0;
}
func 1とfunc 2は必ず戻ることができて、func 3は戻ることができなくて、どうしてですか?
まず,関数戻り値の原理func 1の実現フローを理解し,main関数変数x,yを関数func 1のスタック上のa,bにコピーする.このとき、局所変数cを定義し、a+bの値をcに割り当て、return cの場合、局所変数cの値をシステムが自動的に生成し管理する一時変数c`に割り当て、局所変数cの値を破棄し、rec=func 1(x,y);の場合、rec=一時変数c`の値になります.だから正常に戻ることができます.
では、同じ理屈でfunc 2とfunc 3を比較すると、どんな違いがありますか?
違いはchar*str=「abs」です.「abs」文字列はプログラムの定数記憶領域に保存され、strはこの変数を指し、関数が戻るとstrTmpの一時変数には「abs」のアドレスが保存され、「abs」のアドレスには定数記憶領域があるので正常に戻ることができます.
char str[]=「qwe」;「qwe」は定数記憶領域に格納されているがstrは1つのコピーであるため、関数が戻るとこのコピーの内容は破棄され、returnのbufの一時変数はこのコピーのアドレスであり、中身はすでに乾いているので正常に戻ることはできない.