int testA (void)
{
int b = 1 ;
return b;
}
char * testB (void)
{
char str[] = "abc" ;
return str;
}
int main()
{
printf( " the value of testA is %d \n", testA() );
printf( " the value of testB is %c ", *( testB() ) ) ;
}
對於返回值的情況:
testA與main函數同在棧區,testA結束時C++創建臨時變量,然後將返回值復制給該臨時
變量。
printf( " the value of testA is %d \n", testA())時輸出的是該臨時變量的值,testA中的b已經不存在。
對於返回指針的情況:
這是最復雜的部分。首先,對於上面的情形:返回一個數組的首地址,由於是返回char *
類型,所以C++會首先創建一個char *類型的臨時變量,再把該數組的首地址賦給臨時變量;
函數結束後該數組也就被銷毀,這就意味著臨時變量指向了一個“未聲明的地址”,幸運的情況下,這段內存暫時還沒有被其他的數據所覆蓋,因此還能輸出正確的內容。
在testB裡面,如果換成char* str="abc";return str; 由於這時str指向的是全局數據區的一段內存地址,所以函數結束後臨時變量也指向該地址,所以編譯器不會提出警告。但這樣的方法是不推薦的。
返回引用:
這中情況的效率最高,它直接返回一個對象,不產生返回值的副本。但同時也要注意避免返回局部引用的情況。