關於自己除錯中的函式返回值的部分討論

2021-07-07 02:49:36 字數 1015 閱讀 8105

看以下例子:

#include

char *return_str() 

void main()  

執行輸出如下:

由執行結果可知該函式不存在任何問題,因為"hello world!"是乙個字串常量,存放在常量區,接著把該字串常量存放的常量區的首位址賦值給了指標,所以return_str函式退出時,該字串常量所在記憶體區域不會被**,因此能夠通過指標成功進行訪問。 

但是,以下的程式就會存在問題: 

#include

char *return_str() 

int main() 

執行輸出如下:

由於"hello world!"是乙個字串常量,存放在常量區,可是若把乙個字串常量賦值給了乙個區域性變數(字元型陣列),首先將字串常量從常量區拷貝到棧區,即該區域性變數存放在棧上,這是與前例存在最本質的區別,當return_str函式退出時,棧要清空,區域性變數的記憶體也被清空了,所以這時的函式返回的是乙個已被釋放的記憶體位址,所以列印出來的是亂碼。 

如果函式的返回值必須是乙個區域性變數的位址時,那麼該區域性變數一定要申明為static型別。如下: 

#include

char *return_str() 

int main()  

輸出如下:

由於"hello world!"是乙個字串常量,存放在常量區,但若把乙個字串常量賦值給了乙個靜態區域性變數(字元型陣列),首先將字串常量從常量區拷貝到全域性區,

static

修飾區域性變數

時,表明

在函式呼叫結束時不銷毀

,他的生命期:從第一次呼叫開始,到

main

結束,所以return_str函式退出時,該字串常量所在記憶體區域不會被**,故能夠通過指標成功進行訪問。

結論子函式的返回值

不能返回指向「棧記憶體」的「指標」,由於該內存在函式體被呼叫結束時自動釋放,若再次訪問該記憶體,系統將會報錯,函式返回亂碼。

函式中的返回值

function fn n,m fn 代表函式本身 fn 10,20 實參 給形參傳遞的具體值 代表函式執行後返回的結果,函式執行的時候,都會形成乙個全新的私有作用域 私有棧記憶體 把原有堆記憶體中儲存的字串中變為js 表示式執行 保護裡面的私有變數不受外界的干擾 和外界是隔離的 我們吧函式執行的這...

關於signal函式的返回值

include include include typedef void signal handler int 定義乙個signal handler函式指標型別 signal handler signal int signo,signal handler sig handler 宣告乙個signal...

關於PHP中eval函式的返回值

關於eval 的概念就是把字串作為php 執行。但是關於其返回值,有時候容易出錯。如下面定義乙個函式 function get func type 你能正確說出例1,例2,例3的執行結果嗎?例1 p eval get func type trace p 例2 p eval return get fu...