2015-01-07 48 views
3

我不能理解Yashwant Kanetkar的讓我們C的例子。以下是代碼片段:無法理解讓我們C靜態存儲類的例子

main() 
{ 
    int *j; 
    int *fun(); 
    j = fun(); 
    // If we add a function call here, the print statement prints a garbage value. 
    printf("\n%d",*j); 
} 

int *fun() 
{ 
    int k = 35; 
    return (&k); 
} 

現在在上面的代碼,我無法理解其在打印垃圾值printf語句結果前一個函數調用原因。我有一個模糊的想法,即當返回的值指向堆棧中的內存位置時,在打印此值之前調用另一個函數時出現錯誤。但是我無法清楚地看到這裏發生的事情。請幫忙。

回答

4

在你的代碼

int *fun() 
{ 
    int k = 35; 
    return (&k); 
} 

你從fun()返回一個局部變量的地址。任何返回值的使用導致undefined behaviour

爲了說明,一旦功能fun()完成執行,就不存在k。所以,試圖使用類似&k是無效的。

注意:無論在該書中提供的解釋是否與堆棧沖洗有關,都未在c中進行標準化。

0
int k = 35; 

是本地的功能fun()所以一旦你從fun()返回分配給k內存不再有效,並要返回&k(該變量的地址),這將導致不確定的行爲