2017-04-11 27 views
0

最近,我計算器上讀出的線程返回一個局部變量必須避免其是否指針類型或正常變量。我看到在我的C書爲例,它返回一個局部變量,所以我想嘗試一遍用C返回一個局部變量混淆

#include <stdio.h> 
int func(int a, int b) 
{ 
    int d, e, f; 
    d = a; 
    e = b; 
    f = d+e; 
    return f; 
} 
int main(void) 
{ 
    int c = func(1, 2); 
    printf("hello\n");//I put this printf in between 
    printf("c = %d\n", c);//here c should be overwritten 
    return 0; 
} 

在該線程有人說,如果我把函數調用和訪問該變量之間的任何東西,我會錯過價值。

我能夠訪問本地變量無論我做什麼,但我記得我根據該線程,並顯示所講述相同的行爲寫了一個例子。

我錯過了什麼?

+0

這與本書所說的完全相同的代碼嗎?否則,這是正常行爲,因爲您已經使用'c'將函數的返回值保存在main中。您可以在賦值之後始終讀取其值。 –

+1

返回一個局部變量的*值*很好......返回一個*指針*不是一個局部變量(除非它是靜態的,你知道後果)。 – Dmitri

+0

相關問題:http://stackoverflow.com/questions/4824342/returning-a-local-variable-from-function-in-c – rsp

回答

3

您提到的未命名的線程誤導了您。

在您的例子,FUNC()被返回一個整數。不管它來自哪裏,返回一個整數總是安全的。

值(INT,炭,雙)從不共享。每次你傳遞/返回它們時,該值的一個副本被傳遞/返回,所以它是安全的。

指針(INT *,字符*,雙*)可以共享它們指向的存儲器位置。傳遞/返回它們可能很危險,因爲該內存位置的值會隨着時間而改變。你必須小心指針。

+0

我猜想當時的解釋中缺少一些東西。局部變量可以被複制而不是局部指針。爲什麼?這是關於分割過程中,一個區域的堆棧不能被另一個堆棧區域訪問。所以這個本地指針值被返回,但是在調用者函數堆棧中的那個地址處,垃圾或0將被設置。 – acidlategamer

+0

在執行malloc的情況下,然後返回一個本地指針是可訪問的,因爲堆對於程序中的所有函數都是通用的。 – acidlategamer

+1

這並不是一個函數是否可以訪問另一個堆棧空間 - 只是當函數返回時變量的生命週期結束(除非它是靜態的),並且它佔用的區域可能會變得無效或在函數之後被重用於其他內容回報。例如,將一個指針傳遞給一個函數的本地變量*是很好的,因爲指針將被使用的函數調用發生在它指向的變量的生命期內,而不是在它結束之後。 – Dmitri