1樓:矯閎權映菱
所謂「未定義行為」就是說什麼情況都有可能出現,程式設計師無法確定會發生什麼……
如果硬要追究原因的話,*p=a(b)之後又執行了幾次《運算,函式a的引數所佔的記憶體區域早已被其他變數覆蓋,而a(b)之後立即訪問返回的地址處的變數,函式a的引數所佔的記憶體區域還沒有被覆蓋,所以能夠得到正確的值……這種東西,測試一下,知道有這回事就好,真正寫**的時候不要用,因為永遠不能斷定會不會出現你預想的結果……
2樓:匿名使用者
函式返回後臨時變數佔用的記憶體已被釋放,如果繼續訪問臨時變數,則行為未定義,所以不一樣!
3樓:昨兒忘了前天
呼叫函式a(b)完成後,系統會釋放引數b在棧區的空間,棧區的應用率很高,所以原來b的那塊記憶體會被覆蓋,而p向的是被修改以後的記憶體,而直接呼叫*(a(b))的話,會在b沒有被覆蓋前把b的值取出來。如果這樣定義函式就不會出現這樣的情況了。int * a(int & x)
4樓:匿名使用者
return &x;
返回的是 x 的地址,返回後 x 登出,但地址作為值傳遞給 *p
就這麼回事
c++中如果函式返回指向臨時變數的指標會發生什麼?
5樓:有語卿談
如果你要返回指標的話最好不要返回函式裡面變數的地址,可以返回函式結束後還存在的變數的地址。至於你說的為什麼結果是正確的,由於你fun函式裡面的變數a所在的地址單元已經存放了n的值,而且在後續程式裡並沒有再增加變數的數量,該地址單元的沒有被其他變數分配,還保留下了原來的值。所以結果是正確的。
建議使用返回地址時注意變數的生命週期,要在它滅亡前進行返回,以免出現不可預期的錯誤。如果傳值的話就用返回值傳,或者用已有變數的地址做形參把結果抽取出來。
6樓:工業
永遠不要從函式中返回區域性自動變數的地址。區域性自動變數在函式結束後就被釋放了,,當然這裡不包括靜態變數的地址以及動態變數的地址,, 關於你所出現的情況,,其實如果你賦值語句後不是緊接著輸出 輸出的值都是不可預料的,你可以試試,原因是這塊記憶體還沒有被分配其他的值,**這樣的未定義行為是沒有意義的 也沒有必要思考原因
7樓:
a是區域性變數 返回的p指標指向了區域性變數的位置 。區域性變數在函式執行完後就被**了
8樓:匿名使用者
你返回的是區域性變數的地址,關鍵問題是你出了函式體
c++函式返回值問題怎麼寫?
9樓:手機使用者
(1)函式的返回值是通過函式中的return語句獲得的。return語句將被呼叫函式中的一個確定值帶回主調函式中去。
如果需要從被呼叫函式帶回一個函式值(供主調函式使用),被呼叫函式必須包含return語句。如果不需要從被呼叫函式帶回函式值,則可以不要return語句。
一個函式中可以有一個以上的return語句,執行到哪一個return語句,哪一個語句起作用。
return語句後面的括號可以要,也可以不要,如「return z;」與「return (z);」等價。return後面的值可以是一個表示式。例如:
int max(int x,int y)
如果在主調函式中呼叫它,比如:
a=max(1,2)
那麼函式max的return語句後面表示式的值就是2,也就是說max(1,2)=2,所以a=2
(2)函式值的型別。既然函式有返回值,這個值當然應屬於某一個確定的型別,應當在定義函式是指定函式值的型別。例如下面是幾個函式的部首:
int max(float x,float y);//函式值為整型
char letter(char c1,char c2);//函式值為字元型
double min(int x,int y);//函式值為雙精度型
void change(int a);//函式值為空
(3)如果函式值的型別和return語句中表示式的值不一致,則以函式型別為準,即函式型別決定返回值的型別。對數值型資料,可以自動進行型別轉換。特別提一提void型別,如果一個函式的型別為void,那麼,即使函式中有return語句且return語句中表示式的值不為空,返回值仍為空,嚴格滿足函式型別決定返回值的型別。
c++中 臨時變數引用的問題
10樓:節子不哭
引用臨時變數會出現訪問記憶體的錯誤
函式的返回值,拷貝建構函式的呼叫,表示式的計算中間值一般都是返回臨時變數
臨時變數在這條語句處理完之後,所佔用的記憶體空間就已經釋放了引用和原來的物件訪問的是同一塊記憶體空間,如果引用一個臨時物件,那麼是沒有意義的,等於引用一塊已經釋放的記憶體空間,必然會報記憶體訪問錯誤,而且錯誤是致命的。
11樓:匿名使用者
表示a &r1 = fun1();不能通過編譯.
error: invalid initialization of non-const reference of type 'a&' from a temporary of type 'a'
個人也認為不該通過編譯!!!引用一個函式返回的臨時變數是不可以的.
12樓:水水
在fun2()返回一個返回值的時候,系統會隱式生成一個臨時變數temp,但是編譯器不能對一個臨時變數引用,所以才會報錯
13樓:戀★殤
不清楚...mark一下...
C 關於返回值的問題,C 關於返回值的問題
你應該換一個高階一些的 ide 你這樣寫會報錯的 你a函式定義了返回型別為int 而你函式裡的return 後面沒有寫返回值 應該寫return 返回值 我不知道你取什麼結果 return 後面寫什麼你自己考慮吧 這個函式功能上不需要返回值也可以,因為函式體中已經輸出了資料。但函式定義為int型,且...
vb的函式返回值問題,VB的函式返回值問題
你這個函式只可能返回一個值0。因為你沒有給aaa賦什麼值,其預設值為0。一般來說,函式中的值是否返回是由程式設計者來決定的。如果返回a的值,則作以下更改 private function aaa as integer dim a,b as integer a 1b 2 aaa a 新增這條語句,返回...
用asp 寫函式 返回值,asp函式返回值
function 函式名 引數 as 返回值型別 string integer 函式體。函式名 返回值。end function 以下為一個把字串中的 變為 的函式。function getstr string1 getstr replace string1,end function 例如 str1...