char *test1(void)
{
char b[10] = "abcde";
return b;
}
char *test1_ver2(void)
{
static char b[10] = "abcde";
return b;
}
char *test2(void)
{
char c[10] = "abcde";
char *pStr = c;
return pStr;
}
char *test3(void)
{
char *c = "abcdef";
return c;
}
test1不能運行,甚至可能無法編譯通過;因爲char b[10] 是局部變量,其存放在棧上,在函數執行完成就會被釋放。而返回它存放的地址,此時已經是可能是個非法地址。
test1_ver2可以正確運行,在test1中,我們說test1不能運行或出現編譯錯誤的原因是 b[]數組在函數執行結束後會被釋放,如果我們再對其存放空間進行訪問就會出錯,此時我們定義static char b[10]; 將其存放在靜態存儲區,只有在程序運行結束後纔會被系統回收,即使退出該函數,b[]數組存放的靜態存儲區始終存在,所以,我們再對其進行訪問,不會出現錯誤
test2可以運行。c[10]和*pStr均保存在棧中;該函數返回值是保存在pStr指針中的c數組在棧中的存放地址,當調用該函數時,該地址被複制到外部的指針變量中,然後,保存在棧上的c[]數組和pStr指針的內存空間被釋放。c[]數組的存放地址是被傳送出去了的,但是,由於c[]是局部變量, 在函數執行完成後,存放的內存空間就被釋放,所以,在外部通過指針訪問c[]數組時,指向的內存空間無效,而且還可能出現訪問非法內存的危險。雖然這樣能夠運行,但是沒有實際效果
test3可以運行。*c指針c是保存在棧中,"abcdef"字符串保存在文字常量區,其存放空間,直到程序執行結束纔會被系統回收。所以,返回它的地址是一個實際存在的有效地址。