2014-03-01 110 views
1

本地變量我發現這個代碼on web作爲一個例子,但我認爲這是不正確的。自動變量的地址返回,這是隻是巧合,它可能有時工作:返回靜態指針從功能

返回一個指針破壞局部變量,成爲無效的內存位置,是不確定的行爲

我唯一的一點猶豫是關於指針是static,但我認爲這不會改變,因爲這是變量,應該是static不是指針:局部變量將被銷燬。你能否確認或否認?

double *& showNumber() 
{ 
    double n = 1550.85; 
    static double *v = &n; 
    return v; 
} 

int main(int argc, char *argv[]) 
{ 
    double sn = *showNumber(); 
    sn = *showNumber(); 
    //... 
} 
+0

該程序的整個持續時間靜態挖牆角只要你對它們進行初始化所以這應該是沒關係的V,不針對n –

回答

2

對於要明確這個代碼,既nv將需要static

現在,*showNumber()undefined behaviour,因爲它解除引用dangling pointer

+0

只有'N'應該是靜態 – bolov

+0

五還應該是靜態的預期使用這一功能的是還要返回一個指針我認爲 – 4pie0

+0

@bolov:爲什麼會這樣(記住'v'是通過引用返回的)? – NPE

0

如果指針和它的變量都是靜態的,那麼只有代碼是可以的。否則局部變量無論如何都會死亡。

1

只要初始化它們,靜態變量就會在整個程序期間持續存在。您的全部設置爲v,但不是n的地址。

1

您的代碼仍有未定義的行爲,因爲靜態指針的值在退出函數後無效。指針引用的局部變量將被銷燬。並且下次調用該函數時,該局部變量的地址可能會不同。

你可以寫你的函數通過以下方式

double * showNumber() 
{ 
    static double n = 1550.85; 
    return &n; 
} 

在這種情況下,返回的指針將包含相同的有效值。

+0

謝謝,請記住這不是我的代碼 – 4pie0

+0

在C中,代碼static double * v =&n;將是非法的,因爲&n不是編譯時常量。在C++中,它是合法的;初始化在第一次使用靜態變量時發生,並且只發生一次。所以即使你寫* v = 1.0; _inside_這個函數,它可能會在第二次調用時崩潰。 – gnasher729

0

獨立於本地或全局,靜態變量將一直存在,直到程序結束。 ,但重新開始使用全局變量的值。因爲靜態本地可能會受到線程影響。