char *strA()
{
char str[] = "hello word";
return str;
}
上述程序有什么問題?
簡單的來說,str是個局部變量的地址,作為返回值,有可能被提前回收。
那么局部變量可以作為函數的返回值嗎,這個問題不能一概而論。局部變量作為返回值時,一般是系統先申請一個臨時對象存儲局部變量,也就是找個替代品,這樣系統就可以回收局部變量,返回的只是個替代品。
了解完局部變量返回的過程,那么如果返回的是一個基本類型的變量,比如:
int a;
a = 5;
return a;
那么就會有一個臨時對象也等於a的一個拷貝,即5返回,然后a就被銷毀了。盡管a被銷毀了,但它的副本5還是成功地返回了,所以這樣做沒有問題。
那么如果是指針,這么返回就問題很大,因為你返回的局部變量是地址,地址雖然返回了,但地址所指向的內存中的值已經被回收了,你主函數再去調,就有問題了。這個問題也是可以解決的,可以把局部變量變為靜態變量或者全局變量,這樣就不存放在棧中了,而是存放在靜態存儲區,不會被回收。
char str[] = "hello word";//分配一個局部變量
char *str= "hello word";//分配一個全局變量