C指標7 指標作為函式返回值

2021-10-07 12:36:24 字數 1292 閱讀 2842

c語言允許函式的返回值是乙個指標(位址),我們將這樣的函式稱為指標函式。下面的例子定義了乙個函式 strlong(),用來返回兩個字串中較長的乙個:

#include #include char *strlong(char *str1, char *str2)else

}int main()

用指標作為函式返回值時需要注意的一點是,函式執行結束後會銷毀在它內部定義的所有區域性資料,包括區域性變數、區域性陣列和形式引數,函式返回的指標請盡量不要指向這些資料,c語言沒有任何機制來保證這些資料會一直有效,它們在後續使用過程中可能會引發執行時錯誤。請看下面的例子:

#include #include #include using namespace std;

int *func()

int main()

結果如下:

n 是 func() 內部的區域性變數,func() 返回了指向 n 的指標,即上邊第11行的int *p = func()而func()返回的是n,所以相當於int *p=n,根據上面的觀點,func() 執行結束後 n 將被銷毀,使用 *p 應該獲取不到 n 的值。但是從執行結果來看,我們的推理好像是錯誤的,func() 執行結束後 *p 依然可以獲取區域性變數 n 的值,這個上面的觀點不是相悖嗎?

不是的,可以看到,如果在12行之前加上一些**段,現在 p 指向的資料已經不是原來 n 的值了,它變成了乙個毫無意義的甚至有些怪異的值。與前面的**相比,該段**僅僅是在 *p 之前增加了乙個函式呼叫,這一細節的不同卻導致執行結果有天壤之別。

前面我們說函式執行結束後會銷毀所有的區域性資料,這個觀點並沒錯,大部分c語言教材也都強調了這一點。但是,這裡所謂的銷毀並不是將區域性資料所占用的記憶體全部抹掉,而是程式放棄對它的使用許可權,棄之不理,後面的**可以隨意使用這塊記憶體。對於上的兩個例子,func() 執行結束後 n 的記憶體依然保持原樣,值還是 80,如果使用及時也能夠得到正確的資料,如果有其它函式被呼叫就會覆蓋這塊記憶體,得到的資料就失去了意義。所以要注意一下這點細節,最好不要 將函式返回的指標指向這些資料。

有的例子在呼叫其他函式之前使用 *p 搶先獲得了 n 的值並將它儲存起來,而有的例子顯然沒有抓住機會,有其他函式被呼叫後才使用 *p 獲取資料,這個時候已經晚了,記憶體已經被後來的函式覆蓋了,而覆蓋它的究竟是乙份什麼樣的資料我們無從推斷(一般是乙個沒有意義甚至有些怪異的值)。

指標作為函式返回值

c語言允許函式的返回值是乙個指標 位址 我們將這樣的函式稱為指標函式。下面的例子定義了乙個函式 strlong 用來返回兩個字串中較長的乙個 include include char strlong char str1,char str2 else int main 執行結果 c language ...

用C語言指標作為函式返回值

c語言允許函式的返回值是乙個指標 位址 我們將這樣的函式稱為 指標函式。下面的例子定義了乙個函式 strlong 用來返回兩個字串中較長的乙個 複製 純文字複製 include include char strlong char str1,char str2 else int main includ...

C語言指標作為函式返回值時值丟失

今天程式設計時遇到乙個很納悶的問題,乙個指標中的內容在傳遞過程中值突然丟失了。同時在程式編譯的時候也有乙個warning 其具體資訊如下 warning function returns address of local variable enabled by default 警告資訊表示,函式返回...