c語言中傳回值和返回指標的問題

來源:互聯網
上載者:User

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指向的是全域資料區的一段記憶體位址,所以函數結束後臨時變數也指向該地址,所以編譯器不會提出警告。但這樣的方法是不推薦的。

返回引用:

這中情況的效率最高,它直接返回一個對象,不產生傳回值的副本。但同時也要注意避免返回局部引用的情況。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。