關於C語言中返回局部變量和局部指針變量



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"字符串保存在文字常量區,其存放空間,直到程序執行結束纔會被系統回收。所以,返回它的地址是一個實際存在的有效地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章