關於 C/C++ 中函式能否返回指標的問題
阿新 • • 發佈:2021-08-31
剛才在看 C++ Primer 發現在函式那一章講函式返回值時, 對於返回值能否是引用或指標的問題進行了解答. 但是描述的不是很具體, 在翻閱了一些部落格後在此做個簡單的筆記
結論 : 函式能否返回指標, 取決於指標指向物件的狀態.
1. 指標如果指向一個區域性變數, 那麼函式執行完畢後返回的值是不確定的.
#include <cstdio> using namespace std; int *back() { int x = 1; int *p = &x; return p; } int *BACK() { int x = 2; int *p = &x; return p; } int main(void) { int *p = back(); printf("%d\n", *p); // 輸出1 int *q = BACK(); printf("%d\n", *p); // 輸出2 return 0; }
2. 如果指標指向的值為靜態變數, 或者是堆上的一塊空間, 那麼函式執行完畢後其變數值或所在記憶體區域依然存在.
#include <cstdio> #include <cstdlib> using namespace std; int *back() { static int x = 1; int *p = &x; return p; } int *BACK() { int x = 2; int *p = &x; return p; } int *heap() { int *p = (int *)malloc(sizeof(int)); return p; } int *HEAP() { int *p = (int *)malloc(sizeof(int)); return p; } int main(void) { int *p = back(); printf("%d\n", *p); //輸出 1 int *q = BACK(); printf("%d\n", *p); //輸出依然是 1 p = heap(); printf("%p\n", p); //輸出00000000001c13f0 q = HEAP(); printf("%p\n", p); //輸出依然是00000000001c13f0 return 0; }